我正在使用 ffmpeg 通过此代码将许多视频转换为 avi。
ffmpeg -i input.mp4 -vcodec mpeg4 -qscale:v 1 -aspect 16:9 output.avi
有什么方法可以同时将其应用于 6 个视频吗?
答案1
一个简单的方法同时运行它们可以将它们称为后台进程:
#!/bin/bash
ffmpeg -i input1.mp4 -vcodec mpeg4 -qscale:v 1 -aspect 16:9 output1.avi &
ffmpeg -i input2.mp4 -vcodec mpeg4 -qscale:v 1 -aspect 16:9 output2.avi &
ffmpeg -i input3.mp4 -vcodec mpeg4 -qscale:v 1 -aspect 16:9 output3.avi &
ffmpeg -i input4.mp4 -vcodec mpeg4 -qscale:v 1 -aspect 16:9 output4.avi &
ffmpeg -i input5.mp4 -vcodec mpeg4 -qscale:v 1 -aspect 16:9 output5.avi &
ffmpeg -i input6.mp4 -vcodec mpeg4 -qscale:v 1 -aspect 16:9 output6.avi &
每个命令行末尾&
的将命令指定为后台进程。
但请注意,这些进程会“争夺”处理器资源。
答案2
一个大命令
如果愿意,可以使用一个命令:
ffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 -i video4.mp4 -i video5.mp4 -i video6.mp4 \
-map 0 -c:v mpeg4 -q:v 1 -aspect 16:9 video1.avi \
-map 1 -c:v mpeg4 -q:v 1 -aspect 16:9 video2.avi \
-map 2 -c:v mpeg4 -q:v 1 -aspect 16:9 video3.avi \
-map 3 -c:v mpeg4 -q:v 1 -aspect 16:9 video4.avi \
-map 4 -c:v mpeg4 -q:v 1 -aspect 16:9 video5.avi \
-map 5 -c:v mpeg4 -q:v 1 -aspect 16:9 video6.avi
Bash 循环
或者使用 bashfor 循环我会使用“批量”编码,因为这样可以减少输入。它不会一次性编码所有内容,而是逐个进行编码。
for f in *.mp4; do ffmpeg -i "$f" -c:v mpeg4 -q:v 1 -aspect 16:9 "${f%.*}.avi"; done
速度
至于编码速度,mpeg4
最快的方法可能是 zx485 的答案。我的两个示例应该速度大致相同,但这可能取决于您的硬件、输入数量等。
答案3
您可以使用此命令以递归方式对 cwd 下的整个视频进行编码。
find -name '*.avi' | sed 's/\.avi$//g' | xargs --replace ffmpeg -i "{}.mp4" -c:v mpeg4 -q:v 1 -aspect 16:9 "{}.avi"
如果要并行编码,可以使用此命令。
find -name '*.avi' | sed 's/\.avi$//g' | xargs --replace ffmpeg -i "{}.mp4" -c:v mpeg4 -q:v 1 -aspect 16:9 "{}.avi"
-P
xargs 的选项表示进程数。也许,ffmpeg
命令应该使用线程来并行编译视频。正如其他人提到的,这些进程也“争夺”处理器资源。