Я попытался изменить размер нескольких видео другим способом на моем медленном экземпляре сервера с 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-й.
Я был бы очень признателен, если бы кто-нибудь помог мне разобраться в проблеме!
Я нашел полное решение для моей конкретной проблемы:
Запустить 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
и даже закрыть терминал =)
Вы ставите амперсанд ("&") в конце, что означает: переход в фоновый режим. Это означает, что все ваши преобразования запускаются одновременно. Это проблема для вашего медленного сервера, потому что ЦП должен выполнять кодирование x одновременно. Таким образом, выполнение любого из них занимает очень много времени, не считая накладных расходов, связанных с многозадачностью.
Просто удалите амперсанд в конце и повторите попытку. Это должно работать, но это займет время, если это медленный сервер.
Один простой способ последовательно закодировать все файлы в папке — использовать цикл bash:
for f in *.MP4 ; do ffmpeg -i "$f" -vf scale=854:480 "small$f" ; done
Вы можете определить следующую функцию оболочки:
# 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