FFmpeg5.0源码阅读—— av_read_frame
摘要:本文主要描述了FFmpeg中用于打开编解码器接口av_read_frame
的具体调用流程,详细描述了该接口被调用时所作的具体工作。
关键字:ffmpeg
、av_read_frame
读者须知:读者需要了解FFmpeg的基本使用流程,以及一些FFmpeg的基本常识,了解FFmpegIO相关的内容,以及大致的解码流程。
使用FFmpeg解码视频时需要主动打开解码器获得解码器相关的Context,然后直接调用av_read_frame
读取AVPacket
码流数据送到FFmpeg中进行解码即可。本文主要通过源码了解FFmpeg搜索和打开解码器的基本实现原理和FFmpeg具体的解码流程。
2 av_read_frame
av_read_frame
用于从已经打开的文件中读取未经过解码的码流AVPacket
,对于视频帧就是一帧的压缩帧,对于音频帧如果音频是固定大小的话则可以是多帧,否则也是一帧。av_read_frame
内部读取码流时调用avpriv_packet_list_get
和av_read_frame_internal
。
avpriv_packet_list_get
比较简单就是从当前媒体的PackList中取出一帧。av_read_frame
的函数实现比较长,其大致流程为:
- 调用
ff_read_packet
读取一帧码流; - 如果1步骤失败则调用
parse_packet
刷新解析器,否则继续到步骤3; - 如果当前context需要更新解码器context,则将internal的解码器context更新到stream的解码器context;
- 如果成功拿到预期的帧则下一步,否则跳转到步骤1;
- 后续的工作就是解析元数据,计算需要丢弃的数据大小等。
ff_read_packet
会先检查缓冲区是否有帧没有的话就会调用s->iformat->read_packet
即对应个是的解析码流的函数进行解码。每个FFmpeg支持的格式都有一个FormatContext描述对应格式的信息以及解析对应格式的函数指针,比如下面是mov的格式描述:
static const AVClass mov_class = {.class_name = "mov,mp4,m4a,3gp,3g2,mj2",.item_name = av_default_item_name,.option = mov_options,.version = LIBAVUTIL_VERSION_INT,
};const AVInputFormat ff_mov_demuxer = {.name = "mov,mp4,m4a,3gp,3g2,mj2",.long_name = NULL_IF_CONFIG_SMALL("QuickTime / MOV"),.priv_class = &mov_class,.priv_data_size = sizeof(MOVContext),.extensions = "mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v",.flags_internal = FF_FMT_INIT_CLEANUP,.read_probe = mov_probe,.read_header = mov_read_header,.read_packet = mov_read_packet,.read_close = mov_read_close,.read_seek = mov_read_seek,.flags = AVFMT_NO_BYTE_SEEK | AVFMT_SEEK_TO_PTS,
};
从上面的过程能够看出av_read_frame
完全是同步的操作,可能是比较耗时的,因为如果一直拿不到帧就会一直遍历当前媒体文件的buffer,因此一般建议开一个线程读取Packet。
FFmpeg5.0源码阅读—— av_read_frame相关推荐
- FFmpeg5.0源码阅读之AVClass和AVOption
摘要:本文通过阅读FFmpeg源码来理解FFmpeg中AVOption的实现原理和具体的使用方式. 关键字:AVClss,AVOption,AVOptionRange 版本:FFmpeg5 ...
- FFmpeg5.0源码阅读——AVFrame
摘要:AVFrame是FFmpeg中表示裸数据的结构体,是FFmpeg最重要的结构体之一.本篇文章针对FFmpeg源码理解AVFrame的作用,相关的结构定义以及一些操作API的具体实现. 关 ...
- FFmpeg5.0源码阅读——mov文件格式解析
摘要:之前在Mp4格式详解中详细描述了Mp4文件格式的具体布局方式.为了更加深入理解mp4文件格式,本文记录了ffmpeg中解封装mp4文件的基本实现. 关键字:mov.FFmpeg.mp4 1 简介 ...
- FFmpeg5.0源码阅读——avformat_open_input
摘要:本文主要描述了FFmpeg中用于打开文件接口avformat_open_input的具体调用流程,详细描述了该接口被调用时所作的具体工作. 关键字:ffmpeg.avformat_ope ...
- FFmpeg5.0源码阅读——av_interleaved_write_frame
摘要:本文主要详细描述FFmpeg中封装时写packet到媒体文件的函数av_interleaved_write_frame的实现. 关键字:av_interleaved_write_fram ...
- FFmpeg5.0源码阅读—— avcodec_open2
摘要:本文主要描述了FFmpeg中用于打开编解码器接口avcodec_open2大致流程的具体调用流程,详细描述了该接口被调用时所作的具体工作. 关键字:ffmpeg.avcodec_open ...
- Spring Boot 2.0系列文章(四):Spring Boot 2.0 源码阅读环境搭建
前提 前几天面试的时候,被问过 Spring Boot 的自动配置源码怎么实现的,没看过源码的我只能投降��了. 这不,赶紧来补补了,所以才有了这篇文章的出现,Spring Boot 2. 0 源码阅 ...
- CloudSim 4.0源码阅读笔记(功耗实例)
文章目录 一.NonPowerAware案例 1.1 基本概述 1.2 云任务/虚机/主机/功耗模型参数设置 1.3 初始化云任务(CloudletList)-如何载入自定义真实数据集中的CPU利用率 ...
- AFNetworking 3.0源码阅读 - AFURLResponseSerialization
这次来说一下AFURLResponseSerialization这个HTTP响应类. 定义了一个协议,该协议返回序列化后的结果.后续的AFHTTPResponseSerializer以及他的子类都遵循 ...
最新文章
- 统一沟通成本节约数据表
- Angular2.0 基础: Form
- c语言变凉存储性,C语言数据的表示和存储(IEEE 754标准)
- 【计算机组成原理】定点数的表示和运算
- webpack --- [读书笔记] webpack中常用的一些配置项
- 解决安卓字体偏移:页面整体缩放
- 外贸业务员会计算机知识,外贸业务员、电子商务
- 如何手动从Exchange2007/1010边缘/集线器传输服务器卸载ScanMail for Exchange(SMEX10.0)程序...
- 百度Java出现:“现在学java的都是傻子”相关搜索!
- nginx events 模块配置
- centos7 安装obs studio
- JWS实现WebService
- 【VS2022引用其他项目的.cs文件】
- iOS 2015年3月苹果新的审核标准(中文)
- 帮助Java程序员度过中年危机的2个能力,你了解吗?
- Django进阶教程
- 12星座的出生年月日性格_出生年月与星座对照表
- proteus7【硬件课程设计】
- 图说不为人知的IT传奇故事-3-硅谷DNA创造者HP
- cbm+soma+simm ibm的SOA实施方法论
热门文章
- C语言中的文件操作那些事儿~~
- 机器学习算法与传统优化算法与智能优化算法
- 07Word自动生成图表目录
- VBS基础篇 - 对象(2) - Dictionary对象
- 深圳珍爱网java笔试,珍爱网内推 秋招Java 一面二面
- 虚拟机安装Linux问题小结
- Hbuilder中如何快速输入注释标签_Linux 用户的福音,记忆力解放!快速调用复杂命令...
- Linux小白拿到树莓派4B的第一步:安装
- 重庆北大青鸟解放碑校区 J13班 杨云辉 作品名称:云游网
- 大数据之任务清洗编写HiveSQL代码对数据进行抽取或转换