Как изменить размер нескольких видео с использованием 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-й.

Я был бы очень признателен, если бы кто-нибудь помог мне разобраться в проблеме!

0
задан 19 June 2020 в 21:41

3 ответа

Я нашел полное решение для моей конкретной проблемы:

Запустить 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 и даже закрыть терминал =)

0
ответ дан 20 June 2020 в 15:43

Вы ставите амперсанд ("&") в конце, что означает: переход в фоновый режим. Это означает, что все ваши преобразования запускаются одновременно. Это проблема для вашего медленного сервера, потому что ЦП должен выполнять кодирование x одновременно. Таким образом, выполнение любого из них занимает очень много времени, не считая накладных расходов, связанных с многозадачностью.

Просто удалите амперсанд в конце и повторите попытку. Это должно работать, но это займет время, если это медленный сервер.

Один простой способ последовательно закодировать все файлы в папке — использовать цикл bash:

for f in *.MP4 ; do ffmpeg -i "$f" -vf scale=854:480 "small$f" ;  done
4
ответ дан 19 June 2020 в 19:13

Вы можете определить следующую функцию оболочки:

# 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
1
ответ дан 28 June 2020 в 19:06

Другие вопросы по тегам:

Похожие вопросы: