FFmpeg: 需要速度

4
我正在使用ffmpeg将一组图像(bmp)和音轨转换为Web可用视频。目标格式是h.264 mp4,webm和flv。这是在Windows Azure extra-large实例(8 proc)上使用预构建的zeranoe静态版本(http://ffmpeg.zeranoe.com/builds/)。
假设我愿意为了速度而牺牲质量和大小。每种格式的哪些选项会产生最快的结果?
我的“基准”命令如下(将扩展名替换为其他格式):
ffmpeg -y -i frames%5d.bmp -i audio.mp3 -r 23.97 out.mp4

如果需要,我可以将输入格式更改为其他格式(如jpg图像,aac音频等)。


这是一个更一般的FFMPEG问题,而不是Azure问题。不过有一个提示,使用32位的ffmpeg可执行文件。我曾经遇到64位的问题,后来发现32位的完美稳定。 - astaykov
你看过媒体服务吗?虽然它们不能为单个请求提供原始吞吐量,但可以允许一些相当大规模的作业扩展。 - BrentDaCodeMonkey
@bdcm 我正在为每个用户构建自定义视频。我需要单独的请求非常快速。 - roufamatic
@astaykov 我在64位和32位之间没有看到性能差异,但还是谢谢你的建议。 - roufamatic
@roufamatic 我在使用64位版本时没有性能问题,但遇到了稳定性/编解码器问题,例如随机错误、无法识别的编解码器,有时转换清晰,有时失败,等等。 - astaykov
2个回答

5
你可以通过改变比特率来平衡视频质量和编码速度。在测试中,将比特率从默认的900k调整到100k,编码时间从97秒减少了一半以上。输出的视频文件更小,但是画质明显下降。
对于你的情况,如果你从图片转换为视频,你可以参考FFmpeg编码提示中提到的关闭运动估计来加快编码速度:

如果你的电脑不够快,你可以通过牺牲压缩比来加快压缩速度。你可以使用'-me zero'来加速运动估计,使用'-g 0'来完全禁用运动估计(只有I帧,这意味着它与JPEG压缩效果相当)。[注意,最近的FFmpeg版本使用'-me_method'代替'-me']

在测试中,使用-g 0编码的97秒视频只需要20秒就能完成。虽然压缩比较低,只有原始大小的63%,但质量仍然良好,不像低码率编码那样差。
以下是我的快速测试完整结果,时间为编码所用的实际时间:
基线,27M MOV转换成mp4,比特率约为900k:97s
使用-me_method zero:84s
使用-flags2 fast:84s
使用-b 500k:75s
使用-b 100k:43s
使用-g 0:20s
使用-flags2 fast-b 100k-g 0:12s(输出效果非常糟糕)
可能还有其他格式特定的调整,但与上述方法相比,我不会期望有显著的加速。

1
这些图像的分辨率是多少?使用尽可能低的分辨率将为您提供更好的性能。同时,在ffmpeg中使用-threads选项以最优化地使用8个核心。

我无法控制分辨率(760x442)。Ffmpeg默认添加-threads 0,导致在8个处理器的情况下使用12个线程。通过使用-threads 8,实际上节省了一秒钟的渲染时间。这是一个好的开端! - roufamatic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接