FFmpeg解码流程

学习 FFmpeg ,就不得不提到一位大神,就是 雷霄骅,可惜天妒英才,在这里也先缅怀一下,同时也感谢他在视音频领域以及 FFmpeg 解析上做出的贡献。

我们先了解一下视频播放的流程,这里主要参考的是雷神的文章,[总结]视音频编解码技术零基础学习方法 。过程见下图(图片同样来自雷神的文章,红色框框是我注解的)。

《FFmpeg解码流程》 20140201120523046.jpeg

播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。
如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。

关于每个步骤的含义还是去雷神的文章去看,这里就不啰嗦了。

本文重点讨论的是解封装、解码视频。对于音频的处理先不管。

解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

好了,说了这么多理论,说点实在的。 FFmpeg 解码流程所需要调用的 API 依次为:

开始—->
av_register_all();
avformat_open_input();
av_find_stream_info();
av_find_best_stream();
avcodec_find_decoder();
while(av_read_frame()) {
    获取到packet—->
    avcodec_send_packet();
    avcodec_receive_frame();
    获取到frame
}

上面的流程参考 笔谈FFmpeg(一),其中有几个函数弃用了,所以我更新了一下。
简单的说一下更新的几个函数,其他的网上介绍的很多了,后面我也会推荐几篇文章。

  • av_find_best_stream()
    之前用的都是这样的方法: 穷举所有的流,查找其中种类为CODEC_TYPE_VIDEO 。所以看别人的文章会有个 while 的循环。
  • avcodec_send_packet();avcodec_receive_frame();
    之前用的是 avcodec_decode_video2() 。后来 FFmpeg 把函数拆分了。
  • 还有个需要注意的,avcodec_find_decoder(); 步骤中所用到的也有所变动。下面是以前的用法:
pCodecCtx = pFormatCtx->streams[videoindex]->codec;  
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);  

下面是变动之后的用法:

pCodecCtx = avcodec_alloc_context3(NULL);
avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[videoStream]->codecpar);
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);

通过以上的步骤,获取到 frame 数据就是解码后的原始视频数据。后面我们的存储或者播放也都是基于这个数据的。

参考文章列表:

《FFmpeg解码流程》 扫码关注公众号

原文链接

<推广> 综合计算器 是一款多功能计算器,可以计算房贷、个税、年终奖、利息、BMI指数以及大小金额的计算器,再也不用下载多个计算器找来找去了。还支持实时更新贷款利率哦~。

    原文作者:929be7926bab
    原文地址: https://www.jianshu.com/p/7e96223ff329
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞