![Почему FFmpeg требует nostdin в цикле while?](https://rvso.com/image/1606673/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20FFmpeg%20%D1%82%D1%80%D0%B5%D0%B1%D1%83%D0%B5%D1%82%20nostdin%20%D0%B2%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B5%20while%3F.png)
Если бы у меня был:
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
. По сути, вы можете столкнуться с такими проблемами:
В документации упоминаются фоновые процессы, поскольку обычно они вам не нужны.их в частностидля чтения 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