Странные ошибки при использовании ffmpeg в цикле

Используйте matlab главный режим или режим октавы.

Так или иначе то, что Вы получаете, является интерактивным буфером, где можно ввести команды matlab и возвратить результаты, а также передающие регионы текста, определений целой функции или целых файлов к выполнению matlab процесс.

24
12.04.2012, 16:18
4 ответа

Вашим вопросом является на самом деле Bash FAQ № 89: просто добавьте </dev/null предотвратить ffmpeg от чтения его стандартного входа.


Я брал на себя смелость согласовывания Вашего сценария для Вас, потому что это содержит много потенциальных ошибок. Несколько важных моментов:

  • Имена файлов хитры для обработки, потому что большинство файловых систем позволяет им содержать все виды непечатных символов, которые нормальные люди рассматривали бы как мусор. Создание упрощения предположений как "имена файлов содержит только 'нормальные' символы", имеет тенденцию заканчиваться хрупкие сценарии оболочки, которые, кажется, работают над "нормальными" именами файлов и затем повреждают день, они сталкиваются с особенно противным именем файла, которое не следует за предположениями сценария. С другой стороны, правильно обрабатывающие имена файлов могут быть таким беспокойством, что можно найти его не стоящим усилия, если шанс обнаружения со странным именем файла, как ожидают, будет близким нулем (т.е. Вы только используете сценарий на своих собственных файлах, и Вы даете Вашим собственным файлам "простые" имена). Иногда возможно избежать этого решения в целом, не анализируя имена файлов вообще. К счастью, это возможно с find(1) -exec опция. Просто помещенный {} в аргументе -exec и Вы не должны волноваться о парсинге find вывод.

  • Используя sed или другие внешние процессы, чтобы сделать операции простой строки как разделение расширений и префиксов неэффективны. Вместо этого используйте расширения параметра, которые являются частью оболочки (никакой внешний процесс не означает, что это будет быстрее). Некоторые полезные статьи о предмете упоминаются ниже:

  • Использовать $( ), и не используйте `` больше: Bash FAQ 82.

  • Избегайте использования ПРОПИСНЫХ имен переменной. То пространство имен обычно резервируется оболочкой для особых целей (как PATH), так использование его для Ваших собственных переменных является плохой идеей.

И теперь, без дальнейшей суматохи, вот очищенный сценарий для Вас:

#!/bin/sh

logfile=encodemp4ize.log
echo "Started at $(date)." > "$logfile"
rsync -avz --exclude '*.flv' flvs/ mp4s/

find flvs/ -type f -name '*.flv' -exec sh -c '
for flvsfile; do
    file=${flvsfile#flvs/}
    < /dev/null ffmpeg -i "$flvsfile" -vcodec libx264 -vprofile high \
        -preset slow -b:v 500k -maxrate 500k -bufsize 1000k \
        -threads 0 -acodec libfaac -ab 128k \
        "mp4s/${file%flv}"mp4
    printf %s\\n "$flvsfile MP4 done." >> "$logfile"
done
' _ {} +

Примечание: Я использовал POSIX sh потому что Вы не использовали или нуждаетесь в любом bash- определенные функции в Вашем оригинале.

57
27.01.2020, 19:40
  • 1
    Это - блестящий ответ! Спасибо за усилие, описывающее исправленный сценарий. Просто удивление является там подобным руководству Wiki Greg по zsh?Спасибо! –  Art 24.10.2012, 08:05
  • 2
    @Art Извините, я не знаю очень много о zsh. Возможно, некоторые zsh люди на сайте знали бы. –  jw013 24.10.2012, 16:09
  • 3
    Проблема состоит в том, что я должен проверить, производит ли ffmpeg ошибку для позже вниз, сценарий решает, стереть ли предыдущую версию преобразованного файла. Я преобразовываю mkv в mp4 для Медиасервера Plex. У меня есть заикание с большими mkv файлами, таким образом, я решил преобразовать весь mkv в mp4. Другая проблема состоит в том, что я должен проверить потоковый отказ преобразования подзаголовков на основанные на изображении форматы, в этом случае я использую другой процесс для извлечения замен. Так, как я выполняю ffmpeg, получаю его вывод и не сталкиваюсь с этой проблемой? –  dacabdi 24.11.2016, 17:52

Я нашел решение. Сценарий удара, кажется, производит вход (А именно, 'c' ключ), который вмешивается в ffmpeg процесс.

Добавление < /dev/null к ffmpeg командная строка, как так:

ffmpeg -i "./$f" -vcodec libx264 -vprofile high -preset slow -b:v 500k -maxrate 500k -bufsize 1000k -threads 0 -acodec libfaac -ab 128k "./mp4s/$MP4FILENAME" < /dev/null

устраняет проблему.

15
27.01.2020, 19:40

В качестве альтернативы решению ffmpeg [...] < /dev/nullвы можете использовать:

ffmpeg -nostdin [...]

Подробности из документации ffmpeg:

To explicitly disable interaction you need to specify -nostdin.

Disabling interaction on standard input is useful, for example, if ffmpeg is in the background process group. Roughly the same result can be achieved with ffmpeg... < /dev/null but it requires a shell.

2
20.08.2021, 13:26

В цикле while я столкнулся с похожими проблемами, вы можете использовать цикл for, а в цикле for вы можете не брать список аудио и запускать его в цикле с помощью команды find.

Вы можете использовать такую ​​команду (использовал много раз, и она работает отлично)

for f1 in `find. -maxdepth 1 -name "*.mkv" | sed 's/^\.\///g'`; do ffmpeg -i "$f1" -q:a 0 -map a../wav/"${f1%.*}.wav"; done
0
09.09.2021, 04:56

Теги

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