FFmpeg和GNU Parallel

4
我的工作需要在几天内对几千部电影进行编码。每个电影需要以3种不同的格式进行编码。我使用ffmpeg并行输出这些格式,只需读取一次输入源,详细信息请参见:http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs 此外,我正在使用GNU Parallel同时对多个视频文件进行编码。我们有四台不同配置(48、32、16和16核心)的刀片服务器并行编码视频。理想情况下,我们应该能够同时编码112个视频。
然而,似乎在核心较少的机器上完成编码速度更快。我在16核心服务器上完成了16次编码,用时约4小时,而在48核心系统上完成48次编码需要近10小时。可能是什么瓶颈?一个典型的编码命令如下:
ffmpeg -i sample.mpg -y -vcodec libx264 -vprofile baseline -level 30 -acodec libfdk_aac -ab 128k -ac 2 -b:v 500K -threads 1  encoded/sample_enc.mp4

任何指针都非常感激。谢谢!

存储可能成为瓶颈。看起来你正在使用某种共享存储。这是NFS共享吗?查看刀片上的CPU负载结构,以检查进程是否在等待IO或忙于等待其他操作系统资源。 - Dima Chubarov
事实上,我猜存储确实是一个瓶颈。不幸的是,我没有时间从可移动驱动器中复制内容。复制数TB的数据本身就需要一段时间。我只需将它们连接到服务器并开始编码。现在,我正在尝试alexbuisson的建议。几个小时后会更新。 - souvik
1个回答

1
1个编码分成几个n核是可以的,但每个核心并行编码1个会导致带宽饱和...
尝试为每个转码器激活4个线程以加快1个视频的吞吐量,并限制并行编码的视频数量为2或3,但这取决于您拥有的内存、带宽和视频(例如SD vs HD)。

谢谢!我会立即尝试并在这里发布结果。有没有关于最佳并行编码和每个编码使用的线程数的经验法则,或者我需要通过试错找到正确的数字?非常感谢您的帮助。 - souvik
如果存在规则,那么它必须是一个复杂的规则,因为有很多关于分布式编码的论文。 - alexbuisson
我敢打赌,这可能会很复杂。好吧,我听从了你的建议,到目前为止它真是奏效。我现在正在使用带有“-threads 4”选项的ffmpeg,并使用带有“-j 25%”选项的gnu并行处理,在16个核心上每小时能够生成4个完整的编码(所有三种格式)。谢谢! - souvik
正如Dmitri所建议的那样,IO可能很快就会成为瓶颈,因为我观察到,在32或48核系统上,使用相同源磁盘的编码和上述参数会降低平均值-我每小时不会得到8或12个完整的编码,但需要更长时间。然而,它仍然比我最初发布的旧方案要快。 - souvik
谢谢你的消息,看起来你已经拥有了监控和优化系统所需的一切。祝你好运! - alexbuisson

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