一个大命令

一个大命令

我正在使用 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"

-Pxargs 的选项表示进程数。也许,ffmpeg命令应该使用线程来并行编译视频。正如其他人提到的,这些进程也“争夺”处理器资源。

相关内容