齐藤洋介:FLV解码软件开发

来源:百度文库 编辑:偶看新闻 时间:2024/05/05 14:37:33
FLV解码软件开发的开发,在本课题中是利用的FFmpeg为基础的。FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案[23]。FFmpeg的开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用。FFmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等40多种编码,AVI、MPEG、OGG、Matroska、ASF等90多种解码。TCPMP, VLC, MPlayer等开源播放器都用到了FFmpeg [24]。FFmpeg主目录下主要有libavcodec、libavformat和libavutil等子目录。其中libavcodec用于存放各个encode/decode模块,libavformat用于存放muxer/demuxer模块,libavutil用于存放内存操作等常用模块。以flash movie的flv文件格式为例, muxer/demuxer的flvenc.c和flvdec.c文件在libavformat目录下,encode/decode的mpegvideo.c和h263de.c在libavcodec目录下。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() 初始化输入格式