Скрипт FFmpeg не зацикливается - PullRequest
0 голосов
/ 05 мая 2018

У меня есть несколько видео и вложенных файлов в каталоге. Моя цель - вставлять субтитры в каждое видео. Мой экземпляр в каталоге:

   A.mp4
   A.ass
   B.mp4
   B.ass
   C.mp4
   C.ass
   .
   .
   Z.mp4
   Z.ass

Мой сценарий:

   for f in *.mp4; do base=$(basename ${$f%.mp4}) ffmpeg -i $base.mp4 \
   -vf "ass=$base.ass" 222$base.mp4; done;

Работает только для первого файла, после завершения процесса просит перезаписать выходной файл. Не могли бы вы объяснить, почему это происходит?

1 Ответ

0 голосов
/ 05 мая 2018

base интерпретируется как $(basename ${$f%.mp4}) ffmpeg -i $base.mp4 (как минимум), а не просто $(basename ${$f%.mp4}).

Ленивый раствор

Добавьте точку с запятой:

for f in *.mp4; do base=$(basename "$f" .mp4); ffmpeg -i "$base.mp4" -vf "ass=$base.ass" "222$base.mp4"; done

Либо разбейте команду на несколько строк, чтобы отделить base от команды. Я также внес некоторые дополнительные незначительные изменения, не связанные с основной проблемой (правильное цитирование, исправленное использование baseline, потоковое копирование аудио вместо перекодирования).

Проверьте исходную команду / скрипт с помощью shellcheck для более подробного объяснения и решений.

Лучшее решение

Устранить посторонний процесс basename и использовать вместо него расширение параметра вместо:

for f in *.mp4; do ffmpeg -i "$f" -vf "ass=${f%.*}.ass" -c:a copy "222${f%.*}.mp4"; done

Это эффективнее и короче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...