学习了一部分ffmpeg的知识,但是没有目标的学习似乎好像学不到什么东西。尤其是编程方面。想找一些例子来做,看着别人的博客却提不起兴趣来做。当自己有了一个目标的时候才会充满动力,在了解了一些音视频的知识之后,才知道原来各种音视频的格式不是靠改个后缀名就能改变其编码格式的。于是便想实现一个格式转换的程序,来完成格式的转换。当然我也是只是测试了视频的转换,并没有测试音频的转换。
对于格式的转换其实就是对于要转换的文件首先进行解封装,然后再通过要转换的格式的编解码器进行封装,最后将数据写入目标文件。
其流程图如下:
格式转换代码流程图如下:
实现部分
先从输入文件中读取数据以及数据的信息:
1 | av_register_all(); |
根据输出文件的格式,得到输出文件的解码格式,如果输出文件没有扩展名,则会出错:
1 | AVOutputFormat *out_fmt = av_guess_format(NULL,output_file,NULL); |
将各种流的编解码参数设置到输出Context中:
1 | for(int i=0;i < ifmt_ctx->nb_streams;i++){ |
打开输出文件,并写入数据,写写入头信息,最后写入尾部信息:
1 | if (!(out_fmt->flags &AVFMT_NOFILE)) { |
释放所有申请的资源,关闭打开的环境:
1 | av_bitstream_filter_close(bsf); |
所有代码如下:
1 |
|