![FFmpeg가 while 루프에 nostdin을 요구하는 이유는 무엇입니까?](https://rvso.com/image/1606673/FFmpeg%EA%B0%80%20while%20%EB%A3%A8%ED%94%84%EC%97%90%20nostdin%EC%9D%84%20%EC%9A%94%EA%B5%AC%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%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
. 실제로 다음과 같은 문제가 발생할 수 있습니다.
'읽는 동안'은 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