리눅스에서 동영상 x264(H264, Mpeg4 AVC)로 인코딩하기

리눅스에서 동영상을 인코딩 하는데는 mencoder를 사용한다.
mencoder는 mplayer 를 컴파일하면 같이 생성된다. 또한 x264로 인코딩을 하려면 x264를 먼저 컴파일 한다음
mplayer를 컴파일 해야 한다. 이곳 에 mplayer컴파일 방법을 적어두었다.

다만 mencoder는 커맨드라인 프로그램으로서 콘솔을 열고 직접타이핑해서 사용해야 한다. 물론 매번 이렇게 하기는 힘들기
때문에 쉘스크립트나 다른 언어를 이용 쉽게 인코딩 하도록 프로그램을 작성해서 사용하면 쉽게 사용할 수 있을 것이다.

인코딩은 4단계를 거치는것으로 설명할까 한다.

  1. 영상 인코딩
  2. 동영상에서 음성분리
  3. 음성인코딩
  4. 영상과 음성의 Muxing(음성과 영상을 결합한다.)

여기서 만들 동영상은 컨테이너는 mp4를 사용할 것이고(mp4 확장자를 가진 동영상을 만든다는것) 영상코덱은 x264,
음성은 he-aac 를 이용할 것이다. 목표는 보통 24분짜리 애니 하나를 53메가 정도로 만드는 것이며 이렇게 저용량 동영상을
만드는데 특별한 이유는 없다. 예전에 어디선가 저용량 동영상을 접해 본것이 동기라면 동기이다.

x264는 현재 저용량에 가장뛰어난 영상을 보여주는 영상 압축 코덱이고 ,AAC 역시 저용량에서 음질이 mp3 보다 좋다.

컨테이너로 avi가 아닌 mp4를 선택한 이유는 avi에 AAC음성코덱을 사용하는것이 가능하다고 듣긴 했지만 실제로 이를
지원하는 프로그램도 매우 적고 그다지 권장되지 않는 방법이기 때문이다. 게다가 mp4를 구지 사용하지 않을 이유도 없다. 만일
음성을 AAC가 아닌 OGG로 하고 싶다면 MKV로 만들어야 할것이다. mp4는 mp3와 aac 의 음성코덱만을 지원하는
컨테이너이기 때문이다.

1. 영상인코딩

영상인코딩에는 x264 를 이용할 수 있도록 컴파일된 mencoder를 사용한다. 인코딩에는 1 pass방식
2pass방식이 있다. 이중 1 Pass는 2 Pass를 이해하면 쉽게 알 수 있는것이기도 하고 화질을 좋게 하자면 2pass가
기본이므로 2pass 만 설명하겠다.

2pass 방식은 간단히 말하면 인코딩을 2번하는 것이다. 1번은 간략하게 동영상을 검사하면서 최적으로 인코딩 할 수 있도록
로그를 작성하고 실제 영상 인코딩은 2번째에서 하게된다.

1)1st pass

동영상 파일명은 move.avi 라고 가정한다.

mencoder "movie.avi" -o /dev/null -ofps 11.988 -vf-add scale=640:480
-ovc x264 -x264encopts
bitrate=250:pass=1:bframes=2:b-pyramid:direct=auto:deblock=1,1:subme=1:partitions=none:me=dia
-oac pcm -channels 1 -srate 4000

이상이 1st pass의 옵션이 된다. 간략히 설명하겠다.

-ovc x264 로 x264로 인코딩 하겠다는 걸 알리고, x264의 인코딩 옵션은 -x264encopts 에서 -oac
까지 이다.

-ofs 11.988 -> 결과물을 12프레임으로 인코딩 하겠다는 뜻이다. 저 값은 12000/1001의 값이다(왜
이렇게 하는지는 나도 모른다).

bitrate -> 전송률로서 실제 동영상 용량에 영향을 미친다.250정도면 24분 영상일때 대략 42메가 정도(+-
오차있음) 된다.

bframes=2 -> 화질이 좋아진다고 하긴 하는데 실제 높게 줄 필요 없다는 말도 있다. 인코딩속도에 영향이 많으니
적당히 주자.

subme=1 -> 인코딩 속도에 영향을 준다. 클수록 화질과 파일크기에 영향이 있다. 1st pass에서는 1로
충분. 참고로 기본값은 5.

-vf-add scale=640:480 -> 인코딩 결과물의 화면 크기이다. 정해주지 않으면 당연히 원본의 크기와
같다.

-oac pcm -channels 1 -srate 4000 -> 음성쪽은 인코딩 해줄 필요 없으나 아예 뺄경우 가끔
싱크가 안맞는 일이 있다고 한다.

deblock=1,1 -> 화면의 필터링을 조절한다. 숫자를 높일수록 smooth, 낮출수록 sharp 해 진다.
보통 0:0, -1:-1, 1:1 정도면 된다.

이상이 1st pass에 대한 설명이다 1st pass가 끝나면 2nd pass 작업을 해서 직접 동영상을 인코딩 하게
된다.

2)2nd pass


mencoder "movie.avi" -o "movie.264" -of rawvideo -ofps 11.988 -vf-add
scale=640:480 -ovc x264 -x264encopts
pass=2:bitrate=250:ref=2:mixed-refs:bframes=2:b-pyramid:bime:weightb:direct=auto:deblock=1,1:trellis=1:partitions=all:subme=5
-oac pcm -channels 1 -srate 4000

대부분의 옵션이 설명한 것이라 크게 설명할 것은 없다. -of rawvideo 옵션으로 x264 로 인코딩된 raw 영상데이터를
얻게 된다.

subme=5 옵션은 기본값이라 굳이 줄 필요 없지만 써 줬고 5이상의 값도 줄 수 있다. 참고로 좀더 화질을 높이기 위해
-b-rdo같은 옵션을 쓰려면 subme 값을 6이상 줘야 한다. 7이 최고 값.

x264를 컴파일한 시점에서 x264란 실행파일도 생성되는데 터미널에서 x264를 실행해보면 그외 옵션도 알 수 있다.

무사히 잘 실행 되었다면 movie.264란 파일이 생성되었을 것이다.

2. 동영상에서 음성분리.

이 부분은 약간 양해를 구해야 할것 같다. 2ch을 기준으로 설명하겠다. 5ch등은 mplayer 의 홈페이지등에서 찾아
보기 바란다.

mplayer "movie.avi" -vo /dev/null -ao pcm:file="movie_wave.wav"

이렇게 하면 wave 파일이 생성된다.

3. 음성인코딩

사실 이 부분이 제일 골치였다. 저용량 동영상 제작이 목표인데 음성쪽 용량이 크면 곤란했기 대문이다. 따라서 he-aac 를
쓰기로 했는데 문제는 리눅스용 aac 인코더는 현재 lc-aac 만 지원된다. ogg에 mkv 로 선회하려 하던때에 해결책이
나왔다. nero에서 윈도우용 커맨드라인 aac 인코더가 나왔고 리눅스에서 wine으로 이 인코더를 사용할 수 있다는 것이다.
nero의 aac encoder에 대해선 여기 를 참고 하기 바란다.

그리고 당연히 wine 은 설치되어 있어야 하며 우분투의 경우 패키지로 아주 쉽게 설치 가능하다.


wine /home/aaa/bin/neroAacEnc.exe -q 0.2 -if "movie_wave.wav" -of
"movie_mp4.mp4"

이런식으로 해준다. 위의 경로는 당연히 neroAacEnc.exe 가 있는 경로로 고쳐서 실행해야한다(노파심에…). -q값은 위에
링크된 곳을 참고 하도록 하자.

4. 음성과 영상의 Muxing

이제 영상과 음성이 모두 준비되었다. 이제 남은일은 이 영상과 음성을 mp4 컨테이너에 집어 넣는 일만 하면 된다. 이
프로그램으로 나는 mp4box를 사용한다. mp4box는 GPAC이라는 프로젝트의 일부이다. 홈페이지는 여기
이다. 이 곳에서 소스를 받아 적당한곳에 풀어 놓고 컴파일을 해 보자. 버전에 따라 달라질 지도 모르겠지만 간단한 과정을 적어
본다. 사실 잘 컴파일 될지는 각자의 능력에 맞겨야 할것 같다. 여러 다른 환경이 있을 수 있기 때문이다.

sh configure

make

나의 경우 컴파일 중 에러가 발생했다. opengl 라이브러리 관련 에러 같지만 무시하고 bin/gcc 디렉토리를 확인해
보니 MP4Box 의 실행파일이 존재 했다. 다만 그냥 실행하면 에러가 발생한다. 라이브러리 때문인데 같은 디렉토리에
libgpac.so란 파일이 존재할 것 이다. 이걸 /usr/lib 에 복사해 주자. 나의경우 /usr/local/lib 에
넣어봤지만 무슨일인지 동작하지 않았는데 /usr/local/lib에 넣어서 안되면 /usr/lib에 넣어 보도록 하자(사실 잘
모른다 –;). 이젠MP4Box 가 잘 실행 될것이다. 그러면 모든 준비가 끝났고 이제 마무리를 짓도록 하자.

MP4Box -add "movie.264:fps=11.988" -add "movie_mp4.mp4"
"movie_result.mp4"

여기서는 파일명만 잘 입력해 주고 fps= 부분만 잘 입력해 주면 된다. 당연한 이야기지만 이 값은 위에 영상 인코딩할때의
fps(프레임, mencoder에서의 -ofps 값)값과 같아야만 한다.

아무 에러없이 파일이 생성되었으면 다 된것이다. 축하한다. 이제 mp4를 만들수 있게 되었다.

5. 마무리

매번 이렇게 콘솔창을 넣고 일일이 타이핑 하거나 Copy&Paste로 동영상을 만드는건 매우 번거로운 일이다. 따라서
쉘스크립트나 파이선 , 루비 같은 스크립트 언어를 사용할 줄 안다면 간단하게 프로그램을 만들어 사용하는 것이 좋을 것이다.

만일 psp나 ipod에 들어갈 mp4를 만든다면 mencoder로 영상을 만들때 옵션을 잘 주어야 한다. 이 들 미니기기는
x264의 모든 옵션을 다 지원하지 못하기 때문이다. PC에서는 잘 재생되나 이들 미니기기에선 잘 실행되지 않을 수 있다.
인터넷 검색해 보면 각각 기기에 맞는 옵션 내용을 발견할 수 있을것이니 잘 찾아보기 바란다.

다소 설명이 부족할지도 모르겠지만 나의 지식도 여기에 적은 정도에 불과하기 때문에 더 자세하게 적기는 어렵다. 어디까지나
참고가 되었으면 좋겠다.

만일 mp4 가 아니라 PDA용 소형 Divx avi 동영상을 만드는 것이 목적이라면 리눅스에서 간단하게 mencoder 로
만들 수 있는데 그 때의 mencoder의 사용방법은 좀 변칙적이지만…..윈도우용 프로그램중 ‘바닥’ 이라는 프로그램이 있다. 이
프로그램에서는 윈도우용으로 컴파일된 mencoder를 사용한다. 따라서 바닥으로 동영상을 인코딩 해본 뒤에 그 사용된 옵션을
참고하면 리눅스에서도 mencoder로 동일 옵션으로 동영상을 만들 수 있다.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.