VirtualDub默认保存的是avi格式,有时候需要mp4格式,得先保存avi格式,再用其他工具转换成mp4。其实VirtualDub有一个自定义外部编码器的功能,可以用来输出包括mp4在内的自定义格式的视频文件。
在网上搜索了一天之后,发现相关的资料比较少,而且可能因为版本的差异,很多东西复制过来并不能用。我反复尝试了几个工具,才找到一个比较简单的解决方案,只需要ffmpeg就能完成。
ffmpeg的版本非常多,格式工厂里面等转换工具里也集成了ffmpeg,某些早期版本可能功能上会有些差异,所以最好去官网下一个最新版的。下面详细说一下如何用 ffmpeg + virtualdub 输出mp4文件。
首先点击 选项 > 外部编码器(Options > External encoders...),在编码器Encoders选项卡里点击Add,添加新的外部编码器。
外部编码器有三种,Video encoder、Audio encoder还有Multiplexer,分别对应视频编码器、音频编码器和混流器。一般来说这三个都要用到,因为VirtualDub是分别对音频和视频数据进行编码的。所以下面分别介绍这三个编码器的设置。
视频编码器(Video encoder)
Program里面填写ffmpeg.exe的路径,下面的命令行参数写 -f rawvideo -s %(width)x%(height) -r %(fps) -i - -f mp4 -qscale 1 ”%(tempvideofile)“,这里我用了懒人设置,有兴趣的可以研究下ffmpeg的参数。唯一需要说明的是qscale这个参数,这个参数视频的质量,取值大于0,小于255,数值越小质量越高,文件也越大。再往下,文件名填 %(outputname).m4v,扩展名写mp4也可以,它只是临时文件,只要不与其音频编码器重复即可。下面的选项勾选后三个,非别为输出log和删除旧的输出文件,第一个可不选。
补充:如果某些视频网站对码率有一定要求,可以单独对码率进行设置,例如:-f rawvideo -s %(width)x%(height) -r %(fps) -i - -f mp4 -b:v 10000k -minrate:v 10000k -maxrate:v 10000k -bufsize 20000k "%(tempvideofile)",设置视频码率为10000kbps(如果视频画面尺寸较小,可能达不到预期的码率)。 补充2:N卡用户可以选择硬件编码,可能比默认的方式快好几倍,例如:-f rawvideo -s %(width)x%(height) -r %(fps) -i - -f mp4 -c:v h264_nvenc -b:v 10000k -minrate:v 10000k -maxrate:v 10000k -bufsize 20000k "%(tempvideofile)",
音频编码器(Audio encoder)
与视频编码器设置方法几乎相同,命令行参数写 -i - -acodec aac ”%(tempaudiofile)“,后面的文件扩展名写aac或者m4a都可以,Audio选项卡里,勾选wav格式(推荐)。如果选了raw格式,那么命令行参数需要填 -f s%(audioprecision)le -ar %(samplingratekhz)k -ac %(channels) -i - -acodec aac ”%(tempaudiofile)“,这是我根据网上的raw转pcm教程试出来的,不确定所有参数都有必须或没有bug,所以建议还是用wav格式。
混流器(Multiplexer)
类似音频和视频,主要区别还是参数,这里填写 -i ”%(tempvideofile)“ -i ”%(tempaudiofile)“ -vcodec copy -acodec copy -f mp4 -y ”%(outputfile)“,需要注意,这里没有用-f定义输入格式,因为音频和视频输出文件可以被自动识别,可能-f mp4 也可以省略,这里就不深究了。如果某个版本的ffmpeg真出了问题,可以再回头研究一下。
编码方案设置(Encoder sets)
点这个选项卡,新建一个,取个名字,扩展名写mp4,编码器分别选择刚才那三个,大功告成。
输出mp4
点击 文件 > 导出 > 使用外部编码器(File > Export > Using external encoder...),选择刚才新建的那个mp4,确定,选择输出文件即可。如果一切顺利,恭喜。如果不幸失败了,按F8,研究一下Log吧。