我使用以下命令将 m4a 格式转换为 mp3
ffmpeg -i audio.m4a -acodec libmp3lame audio.mp3
我有 32 个 x86 核心,但 libmp3lame 只在单线程中处理。我知道 libmp3lame 不支持多线程,因此我愿意尝试其他可以在 ubuntu CLI 中执行的替代方案。
如果 audio.m4a 是 2 小时长的视频,则通常需要 3 分钟以上,速度似乎是 45 倍到 50 倍。
我的主要目标是在几秒钟内将多个 YouTube 视频转换为 mp3 格式。
更新 1:
由于我使用的是 32 核 CPU,当只有一个视频转换时,它只使用一个核心。因此,在这种情况下,如何使用多个核心来更快地获得输出。我想从 CPU 中获得最大收益。此外,如果 FFmpeg 不是答案,还有其他方法吗?
答案1
GNU 并行听起来正是您要找的东西。
以下是如何使用的示例GNU 并行(假设您已经有了一个包含所有*.m4a
文件的目录,名为videos
)使用您的原始命令:
find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame {.}.mp3'
需要解释两件事:
1:命令的输出find
(即要转换的文件列表.m4a
)将通过管道传输到parallel
命令中,然后(默认情况下)执行与核心数相同的作业本质上,它是将命令的输出拆分find
,并将其分发到不同的作业中,以便从事于。
2:根据GNU 并行教程,{}
是您的参数所在的位置,{.}
将替换您的参数并删除终端扩展名(在本例中为.m4a
),并且您的输出将是原始文件名,但带有.mp3
扩展名。
笔记:此示例会将所有转换后的文件写入原始文件所在的位置。如果这是问题所在,则只需在包含以下命令的参数字符串中传递一个用于存储转换后文件的目录ffmpeg
:
find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame /path/to/converted/vids/{.}.mp3'
答案2
由于编码器是单线程的,为了使编码在多核系统上最高效,您所能做的就是并行启动多个进程。
例如,如果你在 shell 中:
ffmpeg -i input1.mp4 -c:a libmp3lame output1.mp3 &
ffmpeg -i input2.mp4 -c:a libmp3lame output2.mp3 &
…
放置&
命令进入背景。这些命令将并行运行,并且负载应分布在您的 CPU 核心之间。
答案3
互联网上有 mp3 编码器的多线程实现。我可以在这里找到一个
https://github.com/dheller1/lame_pthreads
如果您有大量存储空间,您可以使用 ffmpeg 将所有 m4a 文件转换为 wav 文件,然后将 lame_pthreads 指向该文件夹。