首页/新闻资讯/正文详情

Linux FFmpeg深度解析之avcodec_parameters_copy调用流程与实战(二十五)

发布时间:2026/11/4 7:10:30 来源:云帆数科 栏目:资讯中心
Linux FFmpeg深度解析之avcodec_parameters_copy调用流程与实战(二十五)
简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮点击获取二维码文章目录1.前言2.应用场景和用法2.1在参数对象之间复制编码信息2.2函数原型与返回语义3.调用流程剖析3.1重置目标并复制字段3.2复制结果进入转封装或编码流程4.实战案例4.1准备源参数和目标对象4.2执行深拷贝并检查字段4.3完整代码5.总结1.前言本篇目的理解avcodec_parameters_copy()如何把一个AVCodecParameters对象的参数复制到另一个对象并通过实战检查动态数据是否独立。封装格式中的AVStream通过codecpar保存流的编码参数。转封装或创建过滤器链时常常需要把一条流的参数复制到另一对象。avcodec_parameters_copy()会先重置目标对象再复制参数并为外部数据分配独立存储。它不复制音视频帧也不负责把参数写入容器。源AVCodecParametersavcodec_parameters_copy重置目标对象复制字段和动态数据独立的目标参数对象2.应用场景和用法2.1在参数对象之间复制编码信息该接口适合复制源流的编解码参数到另一个AVCodecParameters例如转封装时从输入流复制到输出流或把参数复制到码流过滤器的输入参数对象。场景复制目标复制后仍需处理的内容转封装输入流codecpar到输出流codecpar根据输出容器要求处理codec_tag等字段码流过滤器流参数到过滤器par_in初始化过滤器并处理其输出参数参数快照当前参数对象到新分配的对象管理新对象的释放初始化编码上下文不应直接用此函数使用avcodec_parameters_to_context()2.2函数原型与返回语义intavcodec_parameters_copy(AVCodecParameters*dst,constAVCodecParameters*src);参数或返回值含义dst已分配的目标参数对象src要复制的源参数对象返回值成功返回非负值失败返回负的AVERROR错误码函数会先释放目标对象已持有的动态数据再复制结构字段。extradata、编码侧数据和AVChannelLayout等需要管理的内容会建立目标侧自己的存储。函数不接管源对象也不改变源对象的所有权。目标对象应由avcodec_parameters_alloc()创建并在使用后通过avcodec_parameters_free()释放。若目标需要变成AVCodecContext应使用avcodec_parameters_to_context()反向从上下文生成参数则使用avcodec_parameters_from_context()。3.调用流程剖析3.1重置目标并复制字段源码先调用内部重置逻辑清理目标对象再把源结构中的字段复制到目标。随后将动态字段指针置空避免目标对象沿用源对象的地址。对于extradata函数按extradata_size分配带输入缓冲区填充空间的新内存并复制字节。它还复制编码侧附加数据并通过av_channel_layout_copy()建立独立声道布局。源参数对象清理目标旧数据复制普通字段深拷贝附加数据与声道布局返回成功或AVERROR复制不是合并目标原有参数会被重置之后由源对象的内容替代。实现先重置目标再读取源字段因此源和目标必须是不同对象不能把同一个指针同时作为dst和src。3.2复制结果进入转封装或编码流程转封装时常见关系是in_stream-codecpar复制到out_stream-codecpar。复制成功后应用还可能根据输出容器要求调整codec_tag并设置输出流时间基再写入容器头。参数复制本身不执行码流转换。若编码格式、分辨率或采样格式需要改变应进入解码、处理和重新编码流程而不是只复制参数对象。4.实战案例4.1准备源参数和目标对象案例构造AAC音频参数设置采样率、码率、声道布局和两字节AudioSpecificConfig再分别分配源对象与目标对象。4.2执行深拷贝并检查字段调用avcodec_parameters_copy()后检查返回值、基本字段、声道布局和extradata内容。目标extradata应有自己的分配空间释放目标对象不会释放源对象的数据。4.3完整代码#includelibavcodec/codec_par.h#includelibavcodec/avcodec.h#includelibavutil/mem.h#includestring.hintmain(void){AVCodecParameters*srcNULL;AVCodecParameters*dstNULL;intret1;constuint8_taac_config[2]{0x12,0x10};srcavcodec_parameters_alloc();dstavcodec_parameters_alloc();if(srcNULL||dstNULL)gotodone;/* 设置源对象的基本AAC音频参数 */src-codec_typeAVMEDIA_TYPE_AUDIO;src-codec_idAV_CODEC_ID_AAC;src-formatAV_SAMPLE_FMT_FLTP;src-sample_rate44100;src-bit_rate128000;av_channel_layout_default(src-ch_layout,2);/* 准备带FFmpeg要求填充空间的codec extradata */src-extradataav_mallocz(sizeof(aac_config)AV_INPUT_BUFFER_PADDING_SIZE);if(src-extradataNULL)gotodone;memcpy(src-extradata,aac_config,sizeof(aac_config));src-extradata_sizesizeof(aac_config);/* 将源参数复制到独立目标对象 */if(avcodec_parameters_copy(dst,src)0)gotodone;/* 检查普通字段和动态extradata是否正确复制 */if(dst-codec_id!src-codec_id||dst-sample_rate!src-sample_rate||dst-bit_rate!src-bit_rate||dst-extradata_size!src-extradata_size||dst-extradatasrc-extradata||memcmp(dst-extradata,src-extradata,src-extradata_size)!0)gotodone;ret0;done:/* 两个参数对象分别拥有各自的动态数据 */avcodec_parameters_free(dst);avcodec_parameters_free(src);returnret;}5.总结avcodec_parameters_copy()重置目标并复制源参数为动态字段建立独立存储不处理音视频帧或容器写入。

相关推荐

从压测数据到业务洞察:JMeter、Telegraf、InfluxDB与Grafana一体化监控看板构建实践
从压测数据到业务洞察:JMeter、Telegraf、InfluxDB与Grafana一体化监控看板构建实践

性能压测的价值,不仅在于拿到一个TPS数字或一条响应时间曲线,更在于能够实时看见系统在压力下的每一次呼吸。JMeter自带的监听器在GUI模式下受限于渲染效率,在非GUI模式下又缺乏实时可视化的能力。很多团队在压测结束后才从结果文件中回看数据… · 2026/11/4 7:10:30

三大法规同时落地!机器人出海欧盟合规(之三)——ISO 10218:2025 新版机器人功能安全标准深度解读
三大法规同时落地!机器人出海欧盟合规(之三)——ISO 10218:2025 新版机器人功能安全标准深度解读

【摘要】ISO 10218-1/-2:2025 新版工业机器人标准全面重构机器人安全证据链:Class I/II 分级、安全功能规格化、协作要求并入正文、网络安全首次入册。法规定要求,标准给方法——本篇拆解新版标准的核心变化、本体厂与集成商的责任边界,以及送… · 2026/11/4 7:10:30

工业核心数据实时采集:工业网关的周期设计与数据有效性验证
工业核心数据实时采集:工业网关的周期设计与数据有效性验证

摘要: 工业现场的实时数据采集涉及采集频率、PLC通信资源、数据时间、异常识别与业务指标计算等多个问题。设备状态、过程参数和统计数据具有不同的使用需求,采用统一高频轮询并不能保证所有数据都具备较高质量。工业网关的数据采集方案应在明确业务时效… · 2026/11/4 7:10:30

技术博客从零搭建:静态站点、自动部署与SEO收录实战
技术博客从零搭建:静态站点、自动部署与SEO收录实战

先说一个我观察到的现象:大部分人的技术博客死在第 7 天,而不是死在第 700 天。搭建本身只花了两个晚上,第三次更新之后就再也没有打开过那个仓库。原因通常不是懒,而是搭建阶段做了一堆当时觉得"很专业"、事后全变成阻… · 2026/11/4 17:52:57

SQL Server 2012 32位安装教程:配置检查与避坑清单
SQL Server 2012 32位安装教程:配置检查与避坑清单

简介:这份 PDF 图解教程面向准备在 Windows 7 SP1 32 位环境部署 SQL Server 2012 的初学者与运维人员,重点介绍安装前环境确认、安装包选择、系统配置检查、实例与服务器配置、身份验证模式以及数据库引擎设置等关键环节,并通过分步截图和界… · 2026/11/4 17:52:57

Vue 3 Teleport组件:DOM传送门实战指南
Vue 3 Teleport组件:DOM传送门实战指南

1. Vue Teleport 是什么?Vue Teleport 是 Vue 3 内置的一个组件功能,它允许你将模板中的一部分内容"传送"到 DOM 树的其他位置。想象一下,就像科幻电影里的传送门一样,你可以把组件的一部分"传送"到任何你想放… · 2026/11/4 17:52:57

32位Win7安装SQL Server 2012:介质、实例与sa配置避坑
32位Win7安装SQL Server 2012:介质、实例与sa配置避坑

简介:SQL Server 2012 安装图解教程以单份 PDF 形式呈现,面向初次接触微软数据库、需在 Windows 7 SP1 32 位等环境中完成部署的开发者与运维学习者,帮助其建立安装流程的整体认识,减少环境准备阶段的盲目尝试。压缩包内仅含 1 个… · 2026/11/4 17:52:57

Windows下GCC工具链怎么选:MinGW、TDM-GCC与MSYS2
Windows下GCC工具链怎么选:MinGW、TDM-GCC与MSYS2

去年帮一个做桌面工具的小团队收拾构建环境,代码在 Linux 上一路绿灯,拿到 Windows 上就全是毛病:链接阶段报undefined reference to __imp_...,编译出来的程序双击闪退提示找不到libstdc-6.dll,最离谱的是一个std::th… · 2026/11/4 17:52:57

网络安全行业趋势与零信任架构实践指南
网络安全行业趋势与零信任架构实践指南

1. 行业现状与挑战网络安全行业近年来呈现爆发式增长态势,全球市场规模预计将在2026年突破3000亿美元。这个数字背后反映的是数字化转型浪潮下,企业对安全防护的刚性需求。但与此同时,行业也面临着前所未有的挑战。从技术层面来看&#xff0c… · 2026/11/4 17:51:56

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码