까먹지 않으려고 포스팅 함.
ffmpeg은 그야말로 만능 오디오/비디오 트랜스 코더다.
오디오 변환 시 항상 ffmpeg를 사용하는데, 심지어 직접 변환을 못 하는 경우에도 커다란 도움을 준다.
예컨데, 비디오에 들어있는 2번째 오디오를 AAC로 변환하려면 다음과 같이 하면 된다.
ffmpeg -i test.mkv -map 0:2 -vn -acodec pcm_s32le -f wav - | neroAacEnc -lc -if - -ignorelength -of out.aac
또, 2번째 오디오가 32비트/5.1CH이고 스테레오로 변환한 뒤 AAC로 변환하려면 이렇게 하면 된다.
ffmpeg -i test.mkv -map 0:2 -vn -acodec pcm_s32le -f wav - | ffmpeg -i - -ac 2 -f wav - | neroAacEnc -lc -if - -ignorelength -of out.aac
그런데, 이 경우 첫 단계에서 생성(?)되는 파일이 4GB를 넘는 경우가 발생할 수 있어 문제가 된다.
즉, 48KHz, 5.1CH, 32bit 의 오디오의 경우 1초의 데이터는 1,152,000 바이트에 저장된다.
\(48000 \times 6 \times 4 Bytes = 1152000 Bytes\)
이 경우 3728초(62분 8초)를 저장하는데 4GB를 사용하게 되는데, wave 포맷은 4GB 이상을 수용할 수가 없다.
재미있는 것은 이렇게 파이프를 구성하면 실제로 파일이 생성되지는 않지만, 파일이 생성되는 것과 유사한 문제가 발생한다는 것이다.
이런 경우는 아래와 같이 코덱으로 FLAC를 지정하면 쉽게 해결할 수 있다.
ffmpeg -i test.mkv -map 0:2 -vn -acodec flac -f flac - | ffmpeg -i - -ac 2 -f wav - | neroAacEnc -lc -if - -ignorelength -of out.aac
물론, 이건 좀 극단적인 경우고 실제로는 아래와 같이 간단하게 쓰는 게 정석이다.
ffmpeg -i test.mkv -map 0:2 -vn -acodec pcm_s16le -ac 2 -f wav - | neroAacEnc -lc -if - -ignorelength -of out.aac