Почему FFmpeg требует nostdin в цикле while?

Почему FFmpeg требует nostdin в цикле while?

Если бы у меня был:

for i in *.mov;
do
ffmpeg -y -i $i -c:v copy -c:a copy ${i%%.mov}.mp4
done

Это работает нормально. Но если я запущу:

find . -name "*.ts" -print0 | while read -d $'\0' file;
do
  ffmpeg -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done

Это не работает. Мне нужно добавить -nostdin.

find . -name "*.ts" -print0 | while read -d $'\0' file;
do
  ffmpeg -nostdin -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done

В документации поясняется, что это отключает взаимодействие со стандартным вводом и полезно для фоновых процессов.

Почему во втором случае FFmpeg является фоновым процессом? Или есть какая-то другая проблема?

решение1

FFmpeg здесь не фоновый процесс. Он просто считывает свой stdin. Может и нет, но считывает. Это потребляет символы, которые должны идти в read. По сути, вы можете столкнуться с такими проблемами:

«while read» цикл по строкам в текстовом файле теряет символы в скрипте Bash. виновата ли строка FFmpeg?


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

решение2

Разница между рабочим циклом и нерабочим заключается в символе |, который создает подчиненную оболочку.

Если я правильно помню, я решил эту проблему, просто используяecho "" | ffmpeg ...

Из man ffmpeg: -stdin Включить взаимодействие на стандартном вводе. Включено по умолчанию, если стандартный ввод не используется в качестве ввода. Чтобы явно отключить взаимодействие, нужно указать "-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.

echo "" | ffmpegтакой же какffmpeg ... < /dev/null

Связанный контент