当前位置: 首页 > news >正文

2025-03-06 ffmpeg提取SPS/PPS/SEI ( extradata )

一、需求

在某些情况下,可能需要直接使用H264/H265等原始数据流进行解码,比较常用的udp下的h264/h265。这时需要 av_parser_parse2 来组AVPacket,但对于视频的信息:宽高、格式等,可以根据 AVCodecParserContext 来获取,也可以直接提取sps/pps/sei这些原始数据extradata
本文讲如何从原始数据流(AVPacket)中找出 extradata 信息

二、ffmpeg5.0版本以下

在旧版本的ffmpeg中, AVCodecParserContext 内部有个 split 函数,可以直接返回 extradata 在数据流中的位置

 AVCodecParserContext* m_parser    = nullptr;// 初始化 m_parser  // ........//// m_ctx : AVCodecContext*// pkt : AVPacket*// 其中第一个参数 m_ctx 可以不设置,直接设置为nullptr也可auto re = m_parser->parser->split(m_ctx, pkt->data, pkt->size);if (re > 0) {if (m_ctx->extradata_size <= 0 && m_ctx->extradata == nullptr) {//存放于解码器的上下文中,,在m_ctx释放的时候会自动释放m_ctx->extradata_size = re;m_ctx->extradata      = (uint8_t*) av_malloc(m_ctx->extradata_size+ AV_INPUT_BUFFER_PADDING_SIZE);memcpy(m_ctx->extradata, pkt->data, m_ctx->extradata_size);}}

三、ffmpeg5.0版本以上

ffmpeg5.0后 AVCodecParserContext 的 split 函数已删除
但可以使用 av_bsf_get_by_name("extract_extradata")
以下代码可供参考

bool VideoStreamUdpH26X::setupExtraData(const AVCodecParserContext* parser,
AVCodecContext*             ctx,
AVPacket*                   pkt)
{bool need = false;// 检查输入参数及必要信息if (!parser || !pkt || !ctx)return need;if (parser->width <= 0 || parser->height <= 0)return need;// 获取 extract_extradata BSFconst AVBitStreamFilter* bsf = av_bsf_get_by_name("extract_extradata");if (!bsf) {LOG_DEBUG() << "extract_extradata BSF not found";return need;}AVBSFContext* bsf_ctx = nullptr;auto          ret     = av_bsf_alloc(bsf, &bsf_ctx);if (ret < 0) {LOG_DEBUG() << "Failed to allocate BSF context, ret = " << ret;return need;}// 设置 BSF 的输入参数(使用 parser 的部分信息)bsf_ctx->par_in->codec_id   = (AVCodecID) parser->parser->codec_ids[0];bsf_ctx->par_in->codec_type = AVMEDIA_TYPE_VIDEO;bsf_ctx->par_in->width      = parser->width;bsf_ctx->par_in->height     = parser->height;ret = av_bsf_init(bsf_ctx);if (ret < 0) {LOG_DEBUG() << "Failed to initialize BSF context, ret = " << ret;av_bsf_free(&bsf_ctx);return need;}// 将包送入 BSF 提取 extradataret = av_bsf_send_packet(bsf_ctx, pkt);if (ret < 0) {LOG_DEBUG() << "Failed to send packet to BSF, ret = " << ret << printError(ret);av_bsf_free(&bsf_ctx);return need;}// 从 BSF 中取出过滤后的包ret = av_bsf_receive_packet(bsf_ctx, pkt);if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {LOG_DEBUG() << "Failed to receive packet from BSF, ret = " << ret << printError(ret);av_bsf_free(&bsf_ctx);return need;}size_t   extradata_size = 0;uint8_t* side_extradata = av_packet_get_side_data(pkt,AV_PKT_DATA_NEW_EXTRADATA,&extradata_size);if (side_extradata && extradata_size > 0) {// 更新 extradataif (ctx->extradata_size != extradata_size) {if (ctx->extradata) {av_freep(&ctx->extradata);ctx->extradata_size = 0;}ctx->extradata = (uint8_t*) av_malloc(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);if (!ctx->extradata) {LOG_DEBUG() << "Failed to allocate memory for extradata";av_bsf_free(&bsf_ctx);return need;}ctx->extradata_size = extradata_size;memcpy(ctx->extradata, side_extradata, ctx->extradata_size);LOG_DEBUG() << "Extracted extradata: "<< QByteArray((char*) ctx->extradata, ctx->extradata_size).toHex();}need = true;}av_bsf_free(&bsf_ctx);return need;
}

相关文章:

2025-03-06 ffmpeg提取SPS/PPS/SEI ( extradata )

一、需求 在某些情况下&#xff0c;可能需要直接使用H264/H265等原始数据流进行解码&#xff0c;比较常用的udp下的h264/h265。这时需要 av_parser_parse2 来组AVPacket,但对于视频的信息&#xff1a;宽高、格式等&#xff0c;可以根据 AVCodecParserContext 来获取&#xff0…...

海量数据融合互通丨TiDB 在安徽省住房公积金监管服务平台的应用实践

导读 安徽省住房公积金监管服务平台通过整合全省 17 家公积金中心的数据&#xff0c;致力于实现数据共享、规范化管理与高效数据分析。为了应对海量数据处理需求&#xff0c;安徽省选择 TiDB 作为底层数据库&#xff0c;利用其分布式架构和 HTAP 能力&#xff0c;实现了快速的…...

深入解析 supervision 库:功能、用法与应用案例

1. 引言 在计算机视觉任务中&#xff0c;数据的后处理和可视化是至关重要的环节&#xff0c;尤其是在目标检测、分割、跟踪等任务中。supervision 是一个专门为这些任务提供高效数据处理和可视化支持的 Python 库。本文将深入介绍 supervision 的功能、使用方法&#xff0c;并…...

【DeepSeek问答】访问QStandardItemModel::index(r,c)获取的空索引导致程序崩溃

好的&#xff0c;我现在来仔细思考一下用户的问题。用户在使用QStandardItemModel的setItem方法时&#xff0c;调用了setItem(4,6,item)&#xff0c;也就是在第4行第6列的位置设置了一个item。然后他们尝试通过index(3,6)来获取这个位置的项目&#xff0c;想知道会有什么后果。…...

从开源大模型工具Ollama存在安全隐患思考企业级大模型应用如何严守安全红线

近日&#xff0c;国家网络安全通报中心通报大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患&#xff0c;引发了广泛关注。Ollama作为一款开源的大模型管理工具&#xff0c;在为用户提供便捷的同时&#xff0c;却因缺乏有效的安全管控机制&#xff0c;存在数据泄露…...

Aws batch task 无法拉取ECR 镜像unable to pull secrets or registry auth 问题排查

AWS batch task使用了自定义镜像&#xff0c;在提作业后出现错误 具体错误是ResourceInitializationError: unable to pull secrets or registry auth: The task cannot pull registry auth from Amazon ECR: There is a connection issue between the task and Amazon ECR. C…...

通用信息抽取大模型PP-UIE开源发布,强化零样本学习与长文本抽取能力,全面适配多场景任务

背景与简介 信息抽取&#xff08;information extraction&#xff09;是指&#xff0c;从非结构化或半结构化数据&#xff08;如自然语言文本&#xff09;中自动识别、提取并组织出结构化信息。通常包含多个子任务&#xff0c;例如&#xff1a;命名实体识别&#xff08;NER&am…...

基于uniapp的蓝牙打印功能(佳博打印机已测试)

相关步骤 1.蓝牙打印与低功耗打印的区别2.蓝牙打印流程2.1 搜索蓝牙2.2 连接蓝牙 3.连接蓝牙设备4.获取服务5.写入命令源码gbk.jsglobalindex.ts 1.蓝牙打印与低功耗打印的区别 低功耗蓝牙是一种无线、低功耗个人局域网&#xff0c;运行在 2.4 GHz ISM 频段 1、低功耗蓝牙能够…...

【Azure 架构师学习笔记】- Azure Databricks (15) --Delta Lake 和Data Lake

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (14) – 搭建Medallion Architecture part 2 前言 ADB 除了UC 这个概念之外&#xff0c;前面【Azure 架构师学习笔记】- Azure Databricks (1…...

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中

WPF高级 | WPF 应用程序部署与发布&#xff1a;确保顺利交付到用户手中 一、前言二、部署与发布基础概念2.1 部署的定义与目的2.2 发布的方式与渠道2.3 部署与发布的关键要素 三、WPF 应用程序打包3.1 使用 Visual Studio 自带的打包工具3.2 使用第三方打包工具 四、发布到不同…...

在 IntelliJ IDEA(2024) 中创建 JAR 包步骤

下是在 IntelliJ IDEA 中创建 JAR 包的详细的步骤&#xff1a; ​1. 选择File -> Project Structure->Artifacts&#xff0c; (1)点击➕新建&#xff0c;如下图所示&#xff1a; (2)选择JAR->Empty (3)输入jar包名称&#xff0c;确定输出路径 &#xff08;4&#…...

【C++】5.4.3 范围for语句

范围for语句基本形式&#xff1a; for(声明变量:序列容器) {循环执行语句; } 其中&#xff0c;“序列容器”是指花括号括起来的初始值列表、数组、vector或者string等类型的对象&#xff0c;主要特点是拥有能返回迭代器的 begin() 和 end() 成员; “声明变量”是一个类似声明…...

达梦数据库备份

达梦数据库联机在线备份操作指南 一、基础条件与准备 开启归档模式‌: 联机备份必须处于归档模式下&#xff0c;否则无法执行。需通过disql工具执行以下操作&#xff1a; alter database mount; alter database ARCHIVELOG; 例子&#xff1a; [dmdbaserver ~]$ cd /op…...

Linux系统基于ARM平台的LVGL移植

软硬件介绍&#xff1a;Ubuntu 20.04 ARM 和&#xff08;Cortex-A53架构&#xff09;开发板 基本原理 LVGL图形库是支持使用Linux系统的Framebuffer帧缓冲设备实现的&#xff0c;如果想要实现在ARM开发板上运行LVGL图形库&#xff0c;那么就需要把LVGL图形库提供的关于帧缓冲设…...

C++ 二叉搜索树代码

C 二叉搜索树代码 #include <iostream> using namespace std;template<typename T> struct TreeNode{T val;TreeNode *left;TreeNode *right;TreeNode():val(0), left(NULL), right(NULL){}TreeNode(T x):val(x), left(NULL), right(NULL){} };template<typena…...

DeepSeek+知识库+鸿蒙,助力鸿蒙高效开发

不知道你们发现没有&#xff0c;就是鸿蒙开发官网&#xff0c;文档也太多太多了&#xff0c;对于新手来说确实头疼&#xff0c;开发者大多是极客&#xff0c;程序的目的是让世界更高效&#xff01;看文档&#xff0c;挺头疼的&#xff0c;毕竟都是理科生。 遇到问题不要慌&…...

蓝桥杯牛客1-10重点(自用)

1 import mathdef lcm(a,b):return a * b // math.gcd(a, b) # math.gcd(a, b)最小公倍数 a,b map(int,input().split()) # a int(input()) # 只读取一个整数 # print(a) print(lcm(a,b)) 2 import os import sysdef fly(lists,n):count 0flag Falsefor i in range(1,n…...

Kafka - 高吞吐量的七项核心设计解析

文章目录 概述一、顺序磁盘I/O (分区顺序追加)1.1 存储架构设计1.2 性能对比实验1.3 存储优化策略 二、零拷贝技术&#xff1a;颠覆传统的数据传输革命2.1 传统模式痛点2.2 Kafka优化方案 三、页缓存机制&#xff1a;操作系统的隐藏加速器3.1 实现原理3.2 优势对比 四、日志索引…...

Towards Precise and Explainable Hardware Trojan Localization at LUT Level

文章 《Towards Precise and Explainable Hardware Trojan Localization at LUT Level》 TCAD’2025 《LUT层次的精细可解释木马定位》 期刊介绍 《IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems》&#xff08;TCAD&#xff09;是集成电路…...

Python实现鼠标点击获取窗口进程信息

最近遇到挺无解的一个问题&#xff1a;电脑上莫名其妙出现一个白色小方块&#xff0c;点击没有反应&#xff0c;关也关不掉&#xff0c;想知道它和哪个软件有关还是显卡出了问题&#xff0c;也找不到思路&#xff0c;就想着要不获取一下它的进程号看看。 于是写了一个Python脚本…...

Mac安装jdk教程

在Mac上安装JDK&#xff08;Java Development Kit&#xff09;的步骤如下&#xff1a; 一、下载JDK安装包 访问Oracle官网&#xff1a; 打开浏览器&#xff0c;访问Oracle JDK下载页面。 选择JDK版本&#xff1a; 根据你的开发需求选择合适的JDK版本。例如&#xff0c;JDK 11…...

【HeadFirst系列之HeadFirst设计模式】第14天之与设计模式相处:真实世界中的设计模式

与设计模式相处&#xff1a;真实世界中的设计模式 设计模式是软件开发中的经典解决方案&#xff0c;它们帮助我们解决常见的设计问题&#xff0c;并提高代码的可维护性和可扩展性。在《Head First设计模式》一书中&#xff0c;作者通过生动的案例和通俗的语言&#xff0c;深入…...

JDBC 完全指南:掌握 Java 数据库交互的核心技术

JDBC 完全指南&#xff1a;掌握 Java 数据库交互的核心技术 一、JDBC 是什么&#xff1f;为什么它如此重要&#xff1f; JDBC&#xff08;Java Database Connectivity&#xff09;是 Java 语言中用于连接和操作关系型数据库的标准 API。它允许开发者通过统一的接口访问不同的数…...

Vue父子组件传递笔记

Vue父子组件传递笔记 props 父组件向子组件进行传值 &#xff08;1&#xff09;在父组件APP.vue <template><div> <!-- 给子组件Child.vue传递以msg的信号&#xff0c;传递的信息内容为messages --><Child :msg"messages"></Child>…...

文件上传漏洞与phpcms漏洞安全分析

目录 1. 文件上传漏洞简介 2. 文件上传漏洞的危害 3. 文件上传漏洞的触发条件 1. 文件必须能被服务器解析执行 2. 上传目录必须支持代码执行 3. 需要能访问上传的文件 4. 例外情况&#xff1a;非脚本文件也可能被执行 4. 常见的攻击手法 4.1 直接上传恶意文件 4.2 文件…...

【deepseek】辅助思考生物学问题:ICImapping构建遗传图谱gap较大

基于ICImapping构建遗传图谱的常见问题与解答 问题一&#xff1a;染色体两端标记间遗传距离gap较大 答疑一 标记密度不足&#xff08;如芯片设计时分布不均&#xff09;重组概率低基因组结构变异软件算法限制 Deepseek的解释 #### 1. **染色体末端的重组率较低** - **现象*…...

linux磁盘非lvm分区

linux磁盘非lvm分区 类似于windows划分C盘、D盘&#xff0c;并且不需要多个磁盘空间合一 图形化直接分区 通过gparted 这个提供直观的图形化分区&#xff0c;类似windows的磁盘管理工具 下载方式&#xff1a; 乌班图/debian系列&#xff1a; sudo apt install gparted红帽…...

Windows下sql server2012安装流程

准备工作 确认系统要求&#xff1a;确保 Windows 系统为 Windows 7 或更高版本&#xff0c;且为 64 位操作系统&#xff0c;CPU 在 2GHz 以上&#xff0c;内存 4GB 或更高。 下载安装包&#xff1a;从微软官方网站或其他可靠渠道下载 SQL Server 2012 安装包。 关闭相关软件&am…...

css之英文换行样式

在 CSS 中&#xff0c;要实现英文文本自动换行但不从单词中间断开的效果&#xff0c;可以使用 word-wrap 或 overflow-wrap 属性。以下是相关的 CSS 属性和它们的配置&#xff1a; 使用 overflow-wrap 或 word-wrap /* This property is used to handle word breaking */ .wo…...

绝美焦糖暖色调复古风景画面Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 通过 Lr 软件丰富的工具和功能&#xff0c;对风景照片在色彩、影调等方面进行调整。例如利用基本参数调整选项&#xff0c;精准控制照片亮度、对比度、色温、色调等基础要素&#xff1b;运用 HSL 面板可对不同色彩的色相、饱和度以及明亮度进行单独调节&#xff1b;利…...