如下图所示,是本人开发的一个转码转封装小工具
其中目标文件视频编码格式支持:H264,H265,VP8,VP9。
目标文件封装格式支持:mp4,mkv,avi,mov,flv。
目标文件音频编码格式支持两个,COPY和AAC,COPY就是原样复用音频,即-avcodec copy。AAC就是转码成AAC格式。
该工具支持只有一个视频通道的文件;和只有一路视频,一路音频的文件这两种情况。
该工具通过vs2017+qt5.9.6编写,其中ffmpeg依赖的库有libx264,libx265,vpx,opus,fontconfig,freetype,ass。
这里面有个视频帧数量统计,用于控制进度,比如总的视频帧数是3000,现在处理了300帧。则进度显示10%。
在此说明下,本人并没有通过下列方式获取视频帧数量:
m_iVideoFrameNum = m_pFormatCtx_File->streams[m_iVideoIndex]->nb_frames;
这种方式不准,原因有二:
1.对于mkv封装格式而言,该数量读取的数量为0
2.对于mp4封装格式而言,假设读到的nb_frames数量为1200,则最终只可能成功解码1199帧,有一帧未能成功解码,ffprobe工具读到的也是1199帧,这里读者可以参考我写的博客:ffmpeg关于AVStream中nb_frames变量数目不正确的问题分析
所以对于图片数量,本人参考了ffprobe的源码,只有成功解码出视频帧的才会计算在内,这块的代码实现位于函数GetVideoFrameCount内。
本人的成果物目录如下:
这里面总共有4个音视频文件,其中
1.39a8432afe2f70be3c0c2c951d63b868.mp4是只有视频,没有音频的文件,h264编码格式。
2.2022-01-08T22-32-58.mp4既有视频,也有音频,为1080P的分辨率,h264编码格式。
3.TAEYEON-Weekend.mkv既有视频,也有音频,为4K分辨率,VP9视频编码格式,OPUS音频编码格式。
4.2022-01-08T22-32-58.mp4_2023_02_11T15_55_37_H265是由2022-01-08T22-32-58.mp4转码为H265生成的文件,这个需要读者自己生成。
成果物里面有个配置文件FFmpegConvert.ini,内容如下:
其中open_console=true表示打开控制台。
如下所示:如果目标的视频编码格式设置为VP9,封装格式为flv,则控制台会显示报错信息,flv封装格式不支持VP9编码。
工程文件结构如下:注意是64位编译。
里面在视频处理的时候,添加了一个box的滤镜,如下所示:读者可以将其用null滤镜替代,就不会有box了。
最后,本人将成果物上传到百度网盘,地址如下:
链接:https://pan.baidu.com/s/1QbJfamPwRefcf5TguW_S2w?pwd=1234
提取码:1234