실시간 ffmpeg(파이프) 변환을 병렬로 어떻게 실행합니까?

실시간 ffmpeg(파이프) 변환을 병렬로 어떻게 실행합니까?

다음 변환을 수행하고 싶습니다.

for f in *.m4a; do 
    (  ffmpeg -i "$f" -f wav - | opusenc --bitrate 38 - "${f%.m4a}.opus" ) & 
done

나는 내가 사용할 수 있다는 것을 안다ffmpeg직접 opus로 변환하지만 사용하고 싶습니다.opusenc이 경우에는 최신 버전이기 때문입니다.

ffmpeg 후에 opusenc를 실행하면 제대로 작동하지만 위의 실행을 시도하면 많은 결과가 나오고 Stopped아무 일도 일어나지 않습니다.

답변1

GNU Parallel을 사용하면 다음과 같이 작동합니다.

parallel 'ffmpeg -i {} -f wav - | opusenc --bitrate 38 - {.}.opus' ::: *m4a

어쩌면 그 정도면 충분하지 않을까?

CPU 스레드당 1개의 작업만 실행한다는 추가 이점이 있으므로 1000개의 파일이 있으면 컴퓨터에 과부하가 걸리지 않습니다.

답변2

나는 이 구성을 생각해 냈지만 (... &)왜 그것이 작동하는지 잘 모르겠습니다.

for f in R*.mp3
do
  (time ffmpeg -loglevel 0 -i "$f" -ac 1 -y "${f%mp3}new.mp3" && date && ls -l "$f" &)
done

4개 파일 포함:

real    0m0.784s
user    0m0.795s
sys     0m0.048s
So 10 Sep 2023 16:36:43 UTC
-rw-r--r-- 1 root root 1363436   10.Sep 10:04  REC-005.mp3

real    0m1.037s
user    0m1.064s
sys     0m0.040s
So 10 Sep 2023 16:36:43 UTC
-rw-r--r-- 1 root root 1540076   10.Sep 10:04  REC-003.mp3

real    0m1.822s
user    0m1.882s
sys     0m0.055s
So 10 Sep 2023 16:36:44 UTC
-rw-r--r-- 1 root root 2948588   10.Sep 10:04  REC-002.mp3

real    0m2.196s
user    0m2.253s
sys     0m0.061s
So 10 Sep 2023 16:36:44 UTC
-rw-r--r-- 1 root root 3402476   10.Sep 10:04  REC-004.mp3

가장 큰 파일이 마지막에 끝납니다. 나는 timebash-를 가지고 있습니다 list. 그러나 (...&)가 없으면 "중지된" 작업도 발생합니다(확장되지 않은 변수 포함).

관련 정보