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

Linux FFmpeg深度解析之avcodec_flush_buffers调用流程与实战(十九)

发布时间:2026/11/5 7:55:48 来源:云帆数科 栏目:资讯中心
Linux FFmpeg深度解析之avcodec_flush_buffers调用流程与实战(十九)
简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮文章目录1.前言2.应用场景和用法2.1seek后重置解码器2.2函数原型与清理范围3.调用流程剖析3.1清理解码器内部缓存与draining状态3.2demuxer定位与decoder flush各自负责什么4.实战案例4.1准备已经打开的媒体与解码器4.2先定位再重置解码状态4.3seek与flush代码5.总结1.前言本篇目的理解avcodec_flush_buffers()如何重置解码器内部状态说明它在seek和切换码流时的位置并通过跳转后清理旧状态的流程验证使用边界。解码器会保存压缩包、参考帧、时间戳修正和线程状态等内部信息。播放位置跳转或切换到另一条码流后继续使用旧状态可能让新位置的数据受到旧帧影响。avcodec_flush_buffers()用于清理解码器内部状态它不负责在媒体文件中定位也不替代demuxer的seek操作。当前解码状态demuxer定位新位置avcodec_flush_buffers清除旧解码缓存从新位置提交压缩包2.应用场景和用法2.1seek后重置解码器avcodec_flush_buffers()常用于播放位置跳转、切换流或需要丢弃旧解码上下文的场景。seek由av_seek_frame()或其他demuxer接口完成随后调用flush接口清除解码器旧状态再提交新位置的压缩包。它不适用于正常文件结束时的延迟帧排出。正常结束应发送NULL包并接收至AVERROR_EOF若此时直接flush解码器内部尚未输出的延迟帧会被丢弃。2.2函数原型与清理范围voidavcodec_flush_buffers(AVCodecContext*avctx);接口没有返回值调用者应传入有效的AVCodecContext。对解码器flush会释放解码器内部持有的引用但调用者自己持有的AVPacket或AVFrame引用仍然有效。源码中的解码清理会释放内部的输入包和packet属性重置PTS修正状态、bitstream filter状态、draining标志和drain错误计数。外层函数还会清理缓存帧和缓存包并根据线程模式及编解码器实现刷新线程或调用codec的flush回调。编码器只有在声明支持AV_CODEC_CAP_ENCODER_FLUSH时才会执行相应刷新否则该调用会被忽略。本文关注解码器场景。3.调用流程剖析3.1清理解码器内部缓存与draining状态avcodec_flush_buffers()根据上下文选择编码或解码清理路径。解码时进入ff_decode_flush_buffers()释放内部保存的packet引用重置PTS/DTS修正值刷新bitstream filter并清零draining状态。回到外层后函数释放内部缓存的AVFrame和AVPacket引用再依据解码线程配置刷新线程状态如果没有启用帧线程则调用具体codec提供的flush实现。调用者请求重置清理解码包与时间戳状态重置draining和bitstream filter释放内部缓存Frame与Packet刷新线程或codec状态3.2demuxer定位与decoder flush各自负责什么跳转过程涉及两个独立对象。demuxer负责改变输入文件的读取位置解码器负责丢弃旧位置留下的解码状态。avcodec_flush_buffers()只处理后者。因此正确顺序是先成功定位demuxer再flush解码器随后从新位置读取压缩包并提交。若只flush而没有seekdemuxer仍会从原位置继续读若只seek而不flush解码器可能仍保留旧参考帧或缓冲数据。用户发起seekav_seek_frame定位输入avcodec_flush_buffers重置解码器读取新位置AVPacket继续解码新位置数据4.实战案例4.1准备已经打开的媒体与解码器程序已经打开输入文件并初始化目标视频流的AVCodecContext。demuxer提供目标流索引、时间基和seek目标时间戳。时间戳必须按目标AVStream.time_base表达。4.2先定位再重置解码状态调用av_seek_frame()成功后释放应用暂存的旧包再调用avcodec_flush_buffers()。如果定位失败应保留并报告错误不要把失败的seek当成成功跳转继续解码。4.3seek与flush代码#includelibavformat/avformat.h#includelibavcodec/avcodec.h/* stream_index和target_ts对应同一个AVFormatContext */staticintseek_and_flush(AVFormatContext*format,AVCodecContext*decoder,intstream_index,int64_ttarget_ts,AVPacket*pending_packet){intret;/* 先移动demuxer读取位置向前定位到目标附近的关键帧 */retav_seek_frame(format,stream_index,target_ts,AVSEEK_FLAG_BACKWARD);if(ret0)returnret;/* 丢弃应用层暂存的旧位置Packet */av_packet_unref(pending_packet);/* 清除decoder内部旧位置状态不执行demuxer seek */avcodec_flush_buffers(decoder);return0;}调用后下一次av_read_frame()从demuxer的新位置继续读取。视频通常需要从目标时间之前的关键帧重新解码才能恢复参考帧关系这不意味着flush接口会自动把解码输出精确裁剪到目标时间应用仍需依据时间戳处理跳转前后的帧。5.总结avcodec_flush_buffers()清理编解码器内部缓存和状态以便重新开始解码但媒体输入位置仍由demuxer单独定位。

相关推荐

Linux FFmpeg深度解析之avcodec_send_packet调用流程与实战(十七)
Linux FFmpeg深度解析之avcodec_send_packet调用流程与实战(十七)

简介: CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐:《Android系统多媒体进阶实战》🚀 Android Audio工程师专栏地址: Audio工程师进阶系列【原创干货持续更新中……】🚀 Android多媒体专栏地址&a… · 2026/11/2 11:12:03

你用 AI 接单提效了,报价还按人天算,等于把工具月租白送了客户
你用 AI 接单提效了,报价还按人天算,等于把工具月租白送了客户

一个做后台的老哥,被甲方一句话坑了三万块。 大家好,我是冠煌。 我看到这事儿的时候,第一反应是乐了,因为这坑我去年也踩过,还是自己挖的。甲方说,你不是用 AI 吗,赶紧把这套后台弄完。老哥痛快… · 2026/11/5 0:41:03

卓里奇《数学分析》适合哪些学生
卓里奇《数学分析》适合哪些学生

卓里奇《数学分析》是典型的“进阶硬核教材”,适配性极强,只对特定基础和发展方向的学生价值最大化,零基础直接上手反而容易打击学习信心。 🎯 核心适配群体 数学、理论物理、力学专业的本科生:它是莫斯科大学力学数… · 2026/11/5 3:59:20

Go安全测试工具工程化:并发超时、字节解析与限速审计
Go安全测试工具工程化:并发超时、字节解析与限速审计

1. 先把“黑帽子”这三个字摆到台面上:Go 在安全测试里真正吃香的三件事前阵子帮一个做内部资产盘点的团队看代码,他们用某个脚本语言写的探测工具,扫完一个 /16 的网段要跑将近四个小时,中间还因为网络抖动卡死在某个地址上&… · 2026/11/5 8:23:06

校园网POST自动认证:抓包还原、断线重连与守护进程
校园网POST自动认证:抓包还原、断线重连与守护进程

校园网认证这件事,说小很小,说烦是真烦。每天打开电脑,浏览器弹出一个认证页面,输入账号密码,点登录,一天掉线三五次,每次都得重来一遍。如果手上还有一台常年开着的开发机、一台树莓派、几台虚… · 2026/11/5 8:23:06

IT运维实战:故障排查与应急处置手册
IT运维实战:故障排查与应急处置手册

1. 项目概述:IT运维人员的实战急救手册在机房凌晨三点刺耳的报警声中,在CEO会议室投影仪罢工的尴尬时刻,在财务系统突然崩溃的月末关账日——这些场景构成了IT运维人员的日常战场。"IT疑难杂症诊疗室"不是教科书式的理论百科&#… · 2026/11/5 8:23:06

Android中国象棋源码:规则引擎与Alpha-Beta搜索落地
Android中国象棋源码:规则引擎与Alpha-Beta搜索落地

简介:这份 Android 中国象棋源码基于 Java 与 Android Studio 构建,面向希望借助完整可运行项目入门移动游戏开发的初学者与进阶者,覆盖棋盘绘制、棋子走子规则、触摸事件响应、胜负判定与 AI 对弈等核心环节,可用于课程设计、自学… · 2026/11/5 8:23:06

O2O系统中台架构设计与实践指南
O2O系统中台架构设计与实践指南

1. 同城O2O系统与中台架构的必然结合 去年我参与改造某连锁超市的O2O系统时,发现他们前端有7个业务App(会员/配送/团购等),后端却用了12套重复的库存服务。每次促销活动,技术团队都要通宵改代码。这让我深刻意识到&… · 2026/11/5 8:23:06

K210部署20类视觉模型:从YOLO训练到kmodel量化落地
K210部署20类视觉模型:从YOLO训练到kmodel量化落地

简介:面向K210边缘计算入门与实战的20类分类模型工程,基于Maix Dock开发板与MaixPy环境,借助NNCase将YOLO的tflite模型转换为板端可运行的kmodel,适合希望打通模型转换、部署与推理验证链路的开发者与学习者。压缩包共20个文件&am… · 2026/11/5 8:22:05

双极步进电机控制实战: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

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

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驱动调试
双极步进电机控制实战: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

了解更多?预约专属演示

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

企业微信二维码