实验一总结:
-------处理视频文件的过程
1.要打开一个音视频文件,第一步,我们要初始化媒体库,对于ffmpeg我们将avcodec.h和avformat.h包含进来就行了,这两个文件包含了库所支持的所有文件格式和编解码器,通过调用av_register_all() 将这些信息进行注册,这样就可以将相应的文件格式对应到合适的解码器。
1.第二步,打开文件,使用av_open_input_file(AVFormatContext **ptr, const char *filename, AVInputFormat *fmt, int buf_size, AVFormatParameters *ap),利用第二个参数filename打开文件,将文件头和关于文件格式的存储信息保存到ptr指向AVFormateContext结构体中,fmt:不为NULL时则强制规定文件的格式,buf_size:可选的缓冲区大小,ap用于规定解码时的特定参数(时基、采样率、通道数、宽、高、像素格式等),后三个参数如果不指定值,则libavformat会自动检测。
2.第三步,上个函数只是获得了文件的头信息,下面我们要知道文件stream信息,使用av_find_stream_info(),它会寻找stream的不太明显的信息,并将这些信息填充到pFormatCtx的streams域中,这对没有文件头的MPEG文件是很有用的。到此文件的相关信息都已得到,然后会调用dump_format(pFormatCtx, 0, argv[1], 0)将这些信息进行输出,以确定正确性。
3.第四步,上一步中存储在streams域中的是一个指针数组(AVStream类型),nb_streams是文件中streams的个数,然后找到所有的视频stream,并获得该视频stream的编解码器信息,即编解码器的上下文(codec context)pCodecCtx(AVCodecContext类型)(帧速率、采样率、通道数等);
4.这一步我们要找到相应的编解码器,使用avcodec_find_decoder (enum CodecID id ),它利用上一步编解码器上下文pCodecCtx的到的编解码器的id找到相应的编解码器,使用avcodec_open(AVCodecContext *, AVCodec *)使用找到编解码器初始化pCodecCtx;
5.下一步是分配存储帧的物理空间,首先使用avcodec_alloc_