如何使用 ffmpeg 调整多个视频的大小?

如何使用 ffmpeg 调整多个视频的大小?

我尝试在装有 Ubuntu 18 的慢速服务器实例上以不同的方式调整多个视频的大小。

当生成批处理脚本文件时:

ffmpeg -i video1.MP4 -vf scale=854:480 smallvideo1.MP4 &
ffmpeg -i video2.MP4 -vf scale=854:480 smallvideo2.MP4 &
ffmpeg -i video3.MP4 -vf scale=854:480 smallvideo3.MP4 &
...

不知何故,它只随机转换了两三个视频,然后就退出了。每次都smallvideo[i].mp4创建了所有输出文件,但它们无法读取。我也尝试过有-nostdin和没有&,但仍然无法正常工作。

不,我试过这样:

ffmpeg -i video1.MP4 -i video2.MP4 -i video3.MP4 ...
-map 0 -vf scale=854:480 smallvideo1,MP4 & \
-map 1 -vf scale=854:480 smallvideo2.MP4 & \
-map 2 -vf scale=854:480 smallvideo3.MP4 & \
...

它给了我这个错误:

$ 
./ffmpeg.sh: line 6: -map: command not found
./ffmpeg.sh: line 5: -map: command not found
...

它只转换第一个。

如果有人能帮助我解决问题我将不胜感激!

答案1

您在末尾添加了一个“&”符号,这意味着:将 fork 置于后台。这意味着您的所有转换都会同时启动。这对您的慢速服务器来说是一个问题,因为 CPU 必须执行X同时编码。因此,任何一种编码非常需要很长时间才能完成,还不考虑多任务处理需求所涉及的开销。

只需删除末尾的 & 符号并重试即可。它应该可以工作,但如果服务器速度较慢,则需要一些时间。

按顺序编码文件夹中的所有文件的一种简单方法是使用 bash 循环:

for f in *.MP4 ; do ffmpeg -i "$f" -vf scale=854:480 "small$f" ;  done

答案2

我找到了针对我的具体问题的完整解决方案:

运行 bash 脚本:

# screen ./ffmpeg.sh

在脚本中

#!/bin/bash
for f in DJI_*.MP4 ; do ffmpeg -i "$f" -vf scale=854:480 "small$f" ;  done

或者-nostdin在“ffmpeg”后加上标志。现在我可以用 alt+A alt+D 断开连接,重新连接screen -r,甚至关闭终端 =)

答案3

您可以定义以下 shell 函数:

# Usage: video-resize (file) (scale)
video-resize() {
  ffmpeg -y -i "${1}" -vf scale=854:${2:-480} "${1%.*}.resized.${1##*.}"
}

然后运行:

for file in DJI_*.MP4; do video-resize $file; done

相关内容