我尝试在装有 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