ffmpeg mp4视频流解码 |
您所在的位置:网站首页 › mp4格式封装 › ffmpeg mp4视频流解码 |
参考的这篇文章 写的不错 https://blog.csdn.net/zwz1984/article/details/82824524 1.当我们播放一个媒体文件时,通常需要经过以下几个步骤①解封装(Demuxing):就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。 ②解码(Decode):就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3等,视频的压缩编码标准则包含H.264,MPEG2等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV、RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。 ③音视频同步:就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的音频和视频数据,并将音视频频数据送至系统的显卡和声卡播放出来(Render)。 2.FFMPEG音视频解码通过上面对媒体文件播放步骤的了解,我们在解码多媒体文件的时候需要经过两个步骤,即解封装(Demuxing)和解码(Decode)。下面就来看一下FFMPEG解码媒体文件的时候是怎样做这两个步骤的。 av_register_all(); 这个函数,可以注册所有支持的容器和对应的codec。之后我们通过 AVFormatContext *pFormatCtx = avformat_alloc_context(); avformat_open_input(&pFormatCtx,input_cstr,NULL,NULL); avformat_find_stream_info(pFormatCtx,NULL); 来打开一个媒体文件,并获得媒体文件封装格式的上下文。之后我们就可以通过遍历定义在libavformat/avformat.h里保存着媒体文件中封装的流数量的nb_streams在媒体文件中分离出音视频流。 分离出音视频流之后,就可以对音视频流分别进行解码了,这里先以视频解码为例,我们可以遍历AVStream找到codec_type为AVMEDIA_TYPE_VIDEO的的AVStream即为视频流的索引值。 //视频解码,需要找到视频对应的AVStream所在pFormatCtx->streams的索引位置 int video_stream_idx = -1; int i = 0; for(; i < pFormatCtx->nb_streams;i++){ //根据类型判断,是否是视频流 if(pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){ video_stream_idx = i; break; } } 然后我们就可以通过AVStream来找到对应的AVCodecContext即编解码器的上下文。之后就可以通过这个上下文,使用 avcodec_find_decoder() 来找到对应的解码器,再通过 avcodec_open2() 来打开解码器,AVFormatContext、AVStream、AVCodecContext、AVCodec四者之间的关系为 打开解码器之后,就可以循环的将一帧待解码的数据AVPacket送给 avcodec_decode_video2() 进行解码,解码之后的数据存放在AVFrame里面。 3.视频解码示例代码 #include extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" }说一下头文件 为啥要加 extern c 吧 ffmpeg 是c 写的, 如果你不加extern c 的话 就会报链接错误,因为按照c++编译方式 函数名字会变 所以链接错误 如下图: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |