m4a 형식을 mp3로 변환하려면 다음 명령을 사용하십시오.
ffmpeg -i audio.m4a -acodec libmp3lame audio.mp3
32 개의 x86 코어가 있지만 libmp3lame 프로세스는 단일 스레드로 처리됩니다. libmp3lame은 멀티 스레딩을 지원하지 않으므로 우분투 CLI에서 실행할 수있는 다른 대안을 사용할 수 있습니다.
audio.m4a가 2 시간 길이의 비디오 인 경우 일반적으로 3 분 이상 걸리며 속도는 45x ~ 50x로 나타납니다.
내 주요 목표는 여러 YouTube 동영상을 몇 초 내에 mp3 형식으로 변환하는 것입니다.
업데이트 1 :
32 코어 CPU를 사용하고 있기 때문에 비디오 변환이 하나만있을 때는 하나의 코어 만 사용합니다. 이 경우 여러 코어를 사용하여 출력을 더 빨리 얻는 방법. CPU에서 최대치를 달성하고 싶습니다. 또한 FFmpeg가 답이 아닌 경우 다른 방법이 있습니까?
답변
인코더는 단일 스레드 전용이므로 멀티 코어 시스템에서 인코딩을 가장 효율적으로 만들려면 여러 프로세스를 병렬로 시작하면됩니다.
예를 들어, 쉘에있는 경우 :
ffmpeg -i input1.mp4 -c:a libmp3lame output1.mp3 &
ffmpeg -i input2.mp4 -c:a libmp3lame output2.mp3 &
…
는 &
명령을 박았 배경으로 . 명령이 병렬로 실행되며로드는 CPU 코어에 분산되어야합니다.
답변
GNU Parallel 은 여러분이 찾고있는 것과 똑같이 들립니다.
다음은 원래 명령을 사용하여 GNU Parallel을 사용하는 방법의 예입니다 (이미 모든 *.m4a
파일 이있는 디렉토리가 있다고 가정 videos
).
find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame {.}.mp3'
설명해야 할 두 가지 :
1 : find
명령 의 출력 (즉, .m4a
변환 할 파일 목록 )이 parallel
명령 으로 파이프되어 기본적 으로 코어 수만큼 작업을 실행 합니다. 본질적으로 find
명령 의 출력을 분할 하여 다른 작업에 분산하여 작업합니다 .
2 : GNU Parallel Tutorial에 따르면, {}
인수가 진행되는 위치에서 인수를 {.}
대체하고 터미널 확장자 (이 경우에는 .m4a
)를 제거하며 출력은 원래 파일 이름이지만 .mp3
확장자 를 갖습니다.
참고 :이 예에서는 변환 된 모든 파일을 원본 파일이있는 위치에 씁니다. 이것이 문제라면, 디렉토리를 전달하여 ffmpeg
명령을 포함하는 인수 문자열에 변환 된 파일을 저장하십시오 .
find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame /path/to/converted/vids/{.}.mp3'
답변
인터넷에는 lame mp3 인코더의 멀티 스레드 구현이 있습니다. 여기서 추적 할 수 있습니다
https://github.com/dheller1/lame_pthreads
저장 공간이 큰 경우 ffmpeg를 사용하여 모든 m4a 파일을 wav 파일로 변환 한 다음 lame_pthreads를 해당 폴더를 가리킬 수 있습니다.