有时候我们可能会面对这样的一种需求,即我们不需要对视频内的音频或视频信号进行什么实际的操作,只是希望能把文件的封装格式进行转换,例如从avi转换为mp4格式或者flv格式等。实际上,转封装不需要对内部的音视频进行解码,只需要根据从输入文件中获取包含的数据流添加到输出文件中,然后将输入文件中的数据包按照规定格式写入到输出文件中去。
如同之前的工程一样,我们使用命令行参数传入输入和输出的文件名。为此,我们定义了如下的结构体和函数来实现传入输入输出文件的过程:
在main函数执行时,调用hello函数解析命令行并保存到IOFiles结构中:
为了实现视频文件的转封装操作,我们需要以下的结构:
然后所需要的初始化操作有打开输入视频文件、获取其中的流信息和获取输出文件的句柄:
在我们获取到了输入文件中的流信息后,保持输入流中的codec不变,并以其为依据添加到输出文件中:
这里调用了函数avcodec_copy_context函数,该函数的声明如下:
该函数的作用是将src表示的AVCodecContext中的内容拷贝到dest中。
随后,调用avio_open函数打开输出文件:
首先向输出文件中写入文件头:
写入文件的视频和音频包数据,其实就是将音频和视频Packets从输入文件中读出来,正确设置pts和dts等时间量之后,再写入到输出文件中去:
最后要做的就是写入文件尾:
写入输出文件完成后,需要对打开的结构进行关闭或释放等操作。主要有关闭输入输出文件、释放输出文件的句柄等: