摘要:本文主要描述了FFmpeg中用于打开编解码器接口av_read_frame的具体调用流程,详细描述了该接口被调用时所作的具体工作。
  关键字ffmpegav_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_getav_read_frame_internal
  avpriv_packet_list_get比较简单就是从当前媒体的PackList中取出一帧。av_read_frame的函数实现比较长,其大致流程为:

  1. 调用ff_read_packet读取一帧码流;
  2. 如果1步骤失败则调用parse_packet刷新解析器,否则继续到步骤3;
  3. 如果当前context需要更新解码器context,则将internal的解码器context更新到stream的解码器context;
  4. 如果成功拿到预期的帧则下一步,否则跳转到步骤1;
  5. 后续的工作就是解析元数据,计算需要丢弃的数据大小等。

  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相关推荐

  1. FFmpeg5.0源码阅读之AVClass和AVOption

      摘要:本文通过阅读FFmpeg源码来理解FFmpeg中AVOption的实现原理和具体的使用方式.   关键字:AVClss,AVOption,AVOptionRange   版本:FFmpeg5 ...

  2. FFmpeg5.0源码阅读——AVFrame

      摘要:AVFrame是FFmpeg中表示裸数据的结构体,是FFmpeg最重要的结构体之一.本篇文章针对FFmpeg源码理解AVFrame的作用,相关的结构定义以及一些操作API的具体实现.   关 ...

  3. FFmpeg5.0源码阅读——mov文件格式解析

    摘要:之前在Mp4格式详解中详细描述了Mp4文件格式的具体布局方式.为了更加深入理解mp4文件格式,本文记录了ffmpeg中解封装mp4文件的基本实现. 关键字:mov.FFmpeg.mp4 1 简介 ...

  4. FFmpeg5.0源码阅读——avformat_open_input

      摘要:本文主要描述了FFmpeg中用于打开文件接口avformat_open_input的具体调用流程,详细描述了该接口被调用时所作的具体工作.   关键字:ffmpeg.avformat_ope ...

  5. FFmpeg5.0源码阅读——av_interleaved_write_frame

      摘要:本文主要详细描述FFmpeg中封装时写packet到媒体文件的函数av_interleaved_write_frame的实现.   关键字:av_interleaved_write_fram ...

  6. FFmpeg5.0源码阅读—— avcodec_open2

      摘要:本文主要描述了FFmpeg中用于打开编解码器接口avcodec_open2大致流程的具体调用流程,详细描述了该接口被调用时所作的具体工作.   关键字:ffmpeg.avcodec_open ...

  7. Spring Boot 2.0系列文章(四):Spring Boot 2.0 源码阅读环境搭建

    前提 前几天面试的时候,被问过 Spring Boot 的自动配置源码怎么实现的,没看过源码的我只能投降��了. 这不,赶紧来补补了,所以才有了这篇文章的出现,Spring Boot 2. 0 源码阅 ...

  8. CloudSim 4.0源码阅读笔记(功耗实例)

    文章目录 一.NonPowerAware案例 1.1 基本概述 1.2 云任务/虚机/主机/功耗模型参数设置 1.3 初始化云任务(CloudletList)-如何载入自定义真实数据集中的CPU利用率 ...

  9. AFNetworking 3.0源码阅读 - AFURLResponseSerialization

    这次来说一下AFURLResponseSerialization这个HTTP响应类. 定义了一个协议,该协议返回序列化后的结果.后续的AFHTTPResponseSerializer以及他的子类都遵循 ...

最新文章

  1. 统一沟通成本节约数据表
  2. Angular2.0 基础: Form
  3. c语言变凉存储性,C语言数据的表示和存储(IEEE 754标准)
  4. 【计算机组成原理】定点数的表示和运算
  5. webpack --- [读书笔记] webpack中常用的一些配置项
  6. 解决安卓字体偏移:页面整体缩放
  7. 外贸业务员会计算机知识,外贸业务员、电子商务
  8. 如何手动从Exchange2007/1010边缘/集线器传输服务器卸载ScanMail for Exchange(SMEX10.0)程序...
  9. 百度Java出现:“现在学java的都是傻子”相关搜索!
  10. nginx events 模块配置
  11. centos7 安装obs studio
  12. JWS实现WebService
  13. 【VS2022引用其他项目的.cs文件】
  14. iOS 2015年3月苹果新的审核标准(中文)
  15. 帮助Java程序员度过中年危机的2个能力,你了解吗?
  16. Django进阶教程
  17. 12星座的出生年月日性格_出生年月与星座对照表
  18. proteus7【硬件课程设计】
  19. 图说不为人知的IT传奇故事-3-硅谷DNA创造者HP
  20. cbm+soma+simm ibm的SOA实施方法论

热门文章

  1. C语言中的文件操作那些事儿~~
  2. 机器学习算法与传统优化算法与智能优化算法
  3. 07Word自动生成图表目录
  4. VBS基础篇 - 对象(2) - Dictionary对象
  5. 深圳珍爱网java笔试,珍爱网内推 秋招Java 一面二面
  6. 虚拟机安装Linux问题小结
  7. Hbuilder中如何快速输入注释标签_Linux 用户的福音,记忆力解放!快速调用复杂命令...
  8. Linux小白拿到树莓派4B的第一步:安装
  9. 重庆北大青鸟解放碑校区 J13班 杨云辉 作品名称:云游网
  10. 大数据之任务清洗编写HiveSQL代码对数据进行抽取或转换