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
数据就是解码后的原始视频数据。后面我们的存储或者播放也都是基于这个数据的。
参考文章列表:
扫码关注公众号<推广> 综合计算器 是一款多功能计算器,可以计算房贷、个税、年终奖、利息、BMI指数以及大小金额的计算器,再也不用下载多个计算器找来找去了。还支持实时更新贷款利率哦~。