누군가 여기서 무슨 일이 일어나고 있는지 나에게 설명해 줄 수 있습니까? 이것이 내 상황을 다음과 같이 단순화한 방법입니다.
# make 20 test gifs out of the same source file.
for i in {1..20}; do cp -p ../some-random-source-file.gif "${i}.gif"; done
# grab, then process them.
while read f; do echo "→ $f"; ffmpeg -i "$f" -y -loglevel quiet "same.mp4"; done < <(find . -maxdepth 1 -type f -iname "*.gif" -printf "%f\n")
→ 11.gif
→ .gif
→ 9.gif
→ .gif
→ 14.gif
→ 9.gif
→ 0.gif
→ 13.gif
→ 7.gif
→ 5.gif
→ 2.gif
→ .gif
→ 3.gif
→ 0.gif
→ 16.gif
→ .gif
→ 8.gif
→ 8.gif
→ .gif
→ 4.gif
혼합 파일(gif 및 비gif)이 포함된 디렉터리의 모든 gif를 처리하려고 합니다. 그러나 어떤 이유로 해당 ffmpeg
단계를 추가하면 변수의 내용이 $f
처음에 잘리는 경우가 있습니다.
추가 정보:
- 작동하지 않는 파일도 로깅하고 있기 때문에 프로세스 교체를 사용하고 있습니다.
if ! ffmpeg …; then FAILED+=("$f"); fi
- 또한 문자열 교체를 통해 새 파일 이름을 생성했지만
${f%.gif}.mp4
... 알고 보니 해당 부분은 문제 발생과 관련이 없었습니다. - 배쉬 버전 5.1.16
프로세스 대체를 이해합니다.타이밍 문제가 발생할 수 있음- 그런데 왜 변수를 무작위로 잘라내는 걸까요?처음에그리고 마지막이 아닌가? 구조가 그렇게 신뢰할 수 없다면 누가 그것을 사용할 수 있겠는가? 내가 또 무엇을 할 수 있나요?
답변1
ffmpeg
기본적으로 stdin을 읽으므로 일부 문자가 사용됩니다. 플래그를 추가해야 합니다 -nostdin
.
ffmpeg -nostdin -i "$f" -y -loglevel quiet