在 M1 Mac 上使用 FFmpeg 进行并行转码

在 M1 Mac 上使用 FFmpeg 进行并行转码

我正在尝试确定 M1 Mac 使用 FFmpeg 转码视频的效果如何(特别是调整大小和调整比特率)。我可以使用如下命令进行单次转码:

ffmpeg -I in.mp4 -nostdin -c:v h264_videotoolbox -c:a copy -vf scale=1280:720 -b:v 8000k out.mp4

现在,当我运行它时,我可以在活动监视器中看到该过程,但它显示 CPU 使用率很高但 GPU 使用率为 0%,尽管它肯定使用了某种形式的硬件加速(使用 libx264 而不是 h264_videotoolbox 要慢得多)。

当我尝试同时运行多个进程时,时间表明几乎没有并行执行的证据:

测试 定时
转换单个测试文件 6.8秒
连续转换文件 5 次 33.6秒
同时转换文件 5 次 31.5秒

由于 M1 芯片内部应该有 7 或 8 个 GPU,我预计会看到相当好的并行性,那么是否存在我所缺少的选项:

  1. 确保转码确实在 GPU 上运行?
  2. 允许跨多个 GPU 并行执行?

答案1

以下是我在这个主题上找到的内容:

首先,superuser.com 上有一个关于如何增加ffmpeg线程/速度的非常好的答案:

[1]https://superuser.com/a/792609/1211883

Apple M1 7 核 GPU

接下来,以下可能是我为您和您的 M1 Mac 找到的有关该主题的最佳资源:

[2]https://superuser.com/a/1324326/1211883⭐️⭐️⭐️⭐️

[3]https://trac.ffmpeg.org/wiki/HWAccelIntro#VideoToolbox⭐️⭐️⭐️⭐️⭐️

[4]https://doesitarm.com/tv/running-ffmpeg-on-mac-with-apple-silicon-m1-i-woz7p7zmz2s/⭐️⭐️⭐️⭐️

[5]https://github.com/cdgriffith/FastFlix/issues/196⭐️⭐️⭐️

总而言之,

在 macOPS 上有 videotoolbox。

检查一下编码器选项:

ffmpeg -hide_banner -h encoder=hevc_videotoolbox

本质上你必须使用encoder=hevc_videotoolbox硬件编码器。

Nvidia GPU

这里可能是我发现的与 nvidia gpus 相关的最好的资源,以防万一有人有其中之一:

[6]https://developer.nvidia.com/blog/nvidia-ffmpeg-transcoding-guide/

该文件指出:

“从源代码构建 [ffmpeg] 时激活对硬件加速的支持需要一些额外的步骤:”

您可能需要按照那里说的做并在 ffmpeg 安装中添加对硬件加速的支持。

然后在[6]中的“多GPU”标题下,它说明了以下内容:

多 GPU 在一个系统中使用多个 GPU 时,必须明确将编码和解码工作分配给 GPU。GPU 由其索引号标识;默认情况下,所有工作都在索引为 0 的 GPU 上执行。使用以下命令获取系统中所有 NVIDIA GPU 及其对应 ID 号的列表:

ffmpeg -vsync 0 -i input.mp4 -c:v h264_nvenc -gpu list -f null –

一旦知道索引,就可以使用 -hwaccel_device 索引标志来设置用于解码和编码的活动 GPU。在下面的示例中,工作将在索引为 1 的 GPU 上执行。

ffmpeg -vsync 0 -hwaccel cuvid -hwaccel_device 1 -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4

其他有用资源

最后,查看一下 ffmpeg 文档本身也没什么坏处:

[7]https://ffmpeg.org/ffmpeg.html

再次强调,这个资源非常棒,展示了不同ffmpeg平台的可用性和ffmpeg平台的 GPU 选项:

[8]https://trac.ffmpeg.org/wiki/HWAccelIntro

我正在努力提升等级,以便能够真正对一些帖子进行投票,所以我希望这会有所帮助!

不过,尝试及时转码视频总是很有趣的;

答案2

我不同意这个答案。FFmpeg 已默认使用机器中的所有核心。

https://video.stackexchange.com/questions/15996/ffmpeg-encoding-and-core-usage

如果您正在运行多个 ffmpeg 实例,它们可能会受到磁盘限制,并且会产生额外的任务切换开销。如果您发现并非所有核心都得到使用,这是因为您使用的过滤器 - 并非所有过滤器都可以实现并发和并行。

相关内容