简介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提交包并处理EAGAIN4.3发送与接收代码5.总结1.前言本篇目的理解avcodec_send_packet()如何把压缩数据包提交给解码器分析输入何时被接受、何时需要重试并通过发送循环验证EAGAIN的处理方式。Demuxer从媒体文件中取出压缩数据后应用需要把AVPacket交给解码器。avcodec_send_packet()负责提交输入并不保证一次调用就能立即产出AVFrame。如果解码器内部暂时无法接收新包调用者需要先取出已有输出再重试同一个包。可以暂时不能Demuxer得到AVPacket提交压缩数据解码器能否接收输入进入解码器状态先读取已有AVFrame后续调用读取解码结果2.应用场景和用法2.1向解码器提交压缩数据包解码流程中demuxer读取容器并将压缩数据封装为AVPacket解码器通过avcodec_send_packet()接收它。一个包可能产生零帧、一帧或多帧因此发送和接收不能假设严格的一包一帧。常见使用场景场景调用方式需要关注的结果常规解码发送demuxer取出的目标流AVPacket成功表示包被接受后续继续取帧解码器暂时忙收到AVERROR(EAGAIN)先调用接收接口取出输出再重试原包输入文件结束发送NULL包通知解码器进入draining状态排出延迟帧seek或切换码流后恢复先清空旧解码状态使用avcodec_flush_buffers()后再提交新包2.2函数原型与返回语义intavcodec_send_packet(AVCodecContext*avctx,constAVPacket*avpkt);参数或返回值含义avctx已打开的解码器上下文avpkt待解码的压缩包传入NULL表示输入结束并启动draining0输入包已被接受或draining请求已接受AVERROR(EAGAIN)当前无法接收新输入必须先读取输出之后重试当前包AVERROR_EOF已进入draining状态不能再发送普通包AVERROR(EINVAL)上下文未打开、上下文对应编码器或状态不允许提交提交接口会为内部输入包建立引用调用者仍需按自己的生命周期释放AVPacket。如果包不是引用计数数据FFmpeg可能需要复制数据。相邻接口的分工是av_read_frame()从容器读取压缩包avcodec_send_packet()提交输入avcodec_receive_frame()取出解码帧avcodec_flush_buffers()在seek等场景重置解码器状态。3.调用流程剖析3.1检查上下文并保存输入包源码先确认AVCodecContext已经打开且对应解码器。如果上下文已经开始draining普通输入会返回AVERROR_EOF。对于带数据或side data的包函数先检查内部输入包槽位是否为空。如果槽位仍有未处理数据返回AVERROR(EAGAIN)否则调用av_packet_ref()保存输入包引用。调用成功仅表示包已进入解码器输入状态不等于已经得到输出帧。否是AVCodecContext与AVPacket检查解码器和draining状态内部输入槽是否可用返回EAGAIN引用输入包并保存返回提交结果3.2按发送接收状态机推进解码avcodec_send_packet()和avcodec_receive_frame()构成一组相互配合的接口。当发送返回EAGAIN应用要读取输出输出读取到EAGAIN后再重试尚未被接受的输入包。FFmpeg保证发送端和接收端不会同时处于EAGAIN因此调用者可以通过另一端继续推进。成功EAGAIN得到帧EAGAIN发送当前AVPacket发送结果循环读取AVFrame接收结果重试当前AVPacket对EAGAIN收到的包不能直接丢弃也不能读取完输出后改发下一个包这个包尚未被接受必须重试它。输入文件结束时发送NULL包是另一种状态转换之后应持续接收直到AVERROR_EOF。4.实战案例4.1准备解码对象先通过avcodec_find_decoder()查找解码器创建并打开AVCodecContext再从demuxer取得匹配流的AVPacket。发送前应确认包属于目标音视频流并为接收过程准备可复用的AVFrame。4.2提交包并处理EAGAIN发送循环需要保留当前包直到提交成功。若发送返回EAGAIN先排空当前可用帧再重试相同的AVPacket。4.3发送与接收代码下面的函数接收一个已经准备好的解码器上下文、压缩包和帧对象。process_frame()代表应用自己的帧处理逻辑。#includelibavcodec/avcodec.h#includelibavutil/error.h/* 读取当前可用帧直到解码器需要更多输入 */staticintreceive_available_frames(AVCodecContext*decoder,AVFrame*frame){intret;while(1){retavcodec_receive_frame(decoder,frame);if(retAVERROR(EAGAIN)||retAVERROR_EOF)return0;if(ret0)returnret;/* 在这里处理当前解码帧 */process_frame(frame);/* 及时释放当前帧持有的引用 */av_frame_unref(frame);}}/* 提交一个包若输入槽暂不可用先接收帧再重试 */staticintsubmit_packet(AVCodecContext*decoder,constAVPacket*packet,AVFrame*frame){intret;while(1){retavcodec_send_packet(decoder,packet);if(ret!AVERROR(EAGAIN))break;/* EAGAIN表示当前包未被接受先取出已有输出 */retreceive_available_frames(decoder,frame);if(ret0)returnret;}if(ret0)returnret;/* 包已接受继续取出当前已经产生的帧 */returnreceive_available_frames(decoder,frame);}实战中submit_packet()成功后demuxer才继续读取下一包。遇到文件末尾时应单独发送NULL包并继续接收不能把普通包的EAGAIN处理误用为输入结束流程。5.总结avcodec_send_packet()把压缩包提交给解码器遇到EAGAIN时要求调用者先接收输出并重试尚未被接受的原包。
企业数字化 ERP 产品动态
相关推荐
你用 AI 接单提效了,报价还按人天算,等于把工具月租白送了客户 一个做后台的老哥,被甲方一句话坑了三万块。
大家好,我是冠煌。
我看到这事儿的时候,第一反应是乐了,因为这坑我去年也踩过,还是自己挖的。甲方说,你不是用 AI 吗,赶紧把这套后台弄完。老哥痛快… · 2026/11/5 0:41:03
卓里奇《数学分析》适合哪些学生 卓里奇《数学分析》是典型的“进阶硬核教材”,适配性极强,只对特定基础和发展方向的学生价值最大化,零基础直接上手反而容易打击学习信心。
🎯 核心适配群体
数学、理论物理、力学专业的本科生:它是莫斯科大学力学数… · 2026/11/5 3:59:20
App投Meta广告初试,真实数据都在这 上一篇说了,我在试Meta的广告。到现在一共花了118美元,先把这笔账算一下。01 iOS贵,几天就停了我建了两个广告组,一个推安卓,一个推iOS,目标都是移动应用安装,每组每天预算5美元。投的是美国&am… · 2026/11/4 22:10:05
OpenMV与STM32F103C8T6串口通信实现物料搬运机器人视觉控制 简介:这份资源面向参加工程训练类比赛的学生与嵌入式初学者,提供一套基于OpenMV视觉模块与STM32F103C8T6微控制器的物料搬运机器人完整代码方案,用C语言实现图像识别、目标定位与运动控制的协同,解决机器人自主识别物料并完成抓取… · 2026/11/5 8:28:09
GEE Assets 批量删除与复制实战指南 资产目录越堆越乱这件事,几乎每个用 Google Earth Engine 做过几个项目的人都躲不过。最初的几个月图省事,导入的影像随手丢在根目录,命名全靠手打,Collection 和 Image 混在一起,等到项目交接或者要清理额度的时候&am… · 2026/11/5 8:28:09
BI工具冗余如何拖慢企业决策?破解数据孤岛难题 1. 问题现象:BI工具越多,决策反而越慢的怪圈最近三年接触了47家企业的数据分析团队,发现一个有趣的反常现象:约68%的企业在引入第二个BI工具后,季度经营分析会的决策周期平均延长了2.3个工作日。某零售企业甚至出现了&… · 2026/11/5 8:28:09
数字孪生技术架构与实施全解析 1. 数字孪生技术全景解析:从概念到落地实践作为一名长期从事三维可视化与工业数字化的技术从业者,我见证了数字孪生技术从实验室概念到产业落地的完整发展历程。今天,我将系统性地梳理数字孪生领域300个核心术语与技术要点,这些知… · 2026/11/5 8:28:09
GIS可视化中色彩科学与ArcGIS色带应用 1. 色彩科学在GIS可视化中的核心价值地理信息系统(GIS)的可视化效果直接影响数据解读效率,而色彩作为最直观的视觉变量,其科学运用尤为关键。在ArcGIS平台中,色带(Color Ramp)不仅是简单的颜色过… · 2026/11/5 8:28:09
VDSR超分辨率实战:残差学习与20层卷积设计解析 简介:这份资源围绕CVPR2016论文《Accurate Image Super-Resolution Using Very Deep Convolutional Networks》展开,提供VDSR超分辨率模型的Caffe实现,并附带MatConvNet测试代码,面向已具备深度学习基础、希望复现或改进单图像超分… · 2026/11/5 8:27:08
双极步进电机控制实战: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 步进电机驱动实战解析 /* 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工业级双极步进电机控制方案 /* 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
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战: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 步进电机驱动实战解析 /* 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工业级双极步进电机控制方案 /* 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