까먹지 않으려고 포스팅 함.


FFmpeg


ffmpeg은 그야말로 만능 오디오/비디오 트랜스 코더다.
오디오 변환 시 항상 ffmpeg를 사용하는데, 심지어 직접 변환을 못 하는 경우에도 커다란 도움을 준다.
예컨데, 비디오에 들어있는 2번째 오디오를 AAC로 변환[각주:1]하려면 다음과 같이 하면 된다.

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


그런데, 이 경우 첫 단계에서 생성(?)[각주:2]되는 파일이 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



  1. ffmpeg에 내장된 AAC 인코더는 완성도가 상당히 낮아 neroAacEnc를 사용함 [본문으로]
  2. 물론, 실제로 생성되는 게 아니라 생성되는 셈 치는 거임 [본문으로]

+ Recent posts