FFmpeg가 while 루프에 nostdin을 요구하는 이유는 무엇입니까?

FFmpeg가 while 루프에 nostdin을 요구하는 이유는 무엇입니까?

만약 내가 가지고 있다면:

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. 실제로 다음과 같은 문제가 발생할 수 있습니다.

'읽는 동안'은 Bash 스크립트에서 문자가 손실되는 텍스트 파일의 줄을 반복합니다. FFmpeg 라인이 책임이 있습니까?


문서에는 일반적으로 원하지 않는 백그라운드 프로세스가 언급되어 있습니다.특히 그들읽다 stdin. 귀하의 경우 전경 FFmpeg가 stdin.

답변2

작업 루프와 비작업 루프의 차이점은 | 하위 쉘을 생성합니다.

내가 올바르게 기억한다면 간단히 다음을 사용하여 문제를 해결했습니다.echo "" | ffmpeg ...

ffmpeg man에서: -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

관련 정보