FFmpegijkplayer秘籍Android FFMPEG

FFmpeg解码流程

2016-09-30  本文已影响2439人  让历史重演

学习 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(一),其中有几个函数弃用了,所以我更新了一下。
简单的说一下更新的几个函数,其他的网上介绍的很多了,后面我也会推荐几篇文章。

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指数以及大小金额的计算器,再也不用下载多个计算器找来找去了。还支持实时更新贷款利率哦~。

上一篇下一篇

猜你喜欢

热点阅读