실시간 ffmpeg(파이프라인) 변환을 병렬로 실행하는 방법은 무엇입니까?

실시간 ffmpeg(파이프라인) 변환을 병렬로 실행하는 방법은 무엇입니까?

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

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

나는 내가 사용할 수 있다는 것을 안다ffmpeg작품으로 직접 변환했는데 사용하고 싶어요옵센코이 경우 최신 버전이기 때문입니다.

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. 그러나 (...&)가 없으면 (확장되지 않은 변수가 있는) "중지된" 작업도 발생합니다.

관련 정보