FLV视频文件格式实际上并没有明确指出应该使用哪种编码来解析音频和视频数据;它们只是定义了音频流和视频流(或者,有可能是多个音频视频流)如何被绑 定在一个文件里面。这就是为什么有时候,当你打开了一个FLV文件时,你只能听到声音,却不能看到图象--因为没有合适的视频解码器。所 以,libavformat 用来处理解析视频文件并将包含在其中的流分离出来,而libavcodec 则处理原始音频和视频流的解码。
解码处理流程:
1、 通过函数flvdec_init(void)注册初始化编码器,通过REGISTER_MUXDEMUX(FLV, flv)完成对FLV格式的注册,内含音频视频编解码的初始化;
2、 打开视频文件,通过av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)实现,
通过av_find_stream_info(pFormatCtx)、dump_format(pFormatCtx, 0, filename, false)分析文件数据包编码格式,再把pFormatCtx的流域填满;
3、通过avcodec_find_decoder(pCodecCtx->codec_id)找到相应的解码器,
4、打开解码器,通过函数(avcodec_open(pCodecCtx, pCodec);
5、 视频数据解码通过avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, rawData, bytesRemaining)解析视频数据包,得到视频帧,GetNextFrame(AVFormatContext *pFormatCtx, AVCodecContext *pCodecCtx, int videoStream, AVFrame *pFrame );视频编码格式为FLV1;
6、音频数据包通过avcodec_decode_audio()解码,得到的数据存入buffer中,根据时间戳来实现音视频的同步;音频编码格式有PCM、ADPCM、MP3;
7、释放解码器,关闭解码器(codec),avcodec_close(pCodecCtx); 关闭视频文件av_close_input_file(pFormatCtx);
表5-6 FLV解码软件中部分重要处理函数接口
函数接口 作用
flv_probe() 探测文件是否为FLV文件
flv_read_packet ( ) 读入数据包,分析数据包
flv_read_close( ) 关闭读操作
flv_read_header() 读入头数据
av_register_input_format() 初始化输入格式
原文地址:http://www.cnblogs.com/spiderdzl/p/3850306.html