출처 : http://iparid.egloos.com/page/2
 
x264 인코딩 가이드: 명령행 x264
x264 코덱의 성능과 악명을 동시에 들어오던 차에, 요즘 심취하게 된 퍼스트 건담 avi의 사이즈를 줄일 목적으로 손을 대 보았습니다. 먼저 xvid 1.1.0을 써서 비트레이트를 줄여보았지만, 어쩔 수 없는 깍두기와 변색 때문에 xvid는 포기했습니다.

하룻밤 동안의 삽질을 거쳐 x264 인코딩의 얼개를 파악했습니다.
필요한 유틸리티는 다음과 같습니다.

x264 rev. 604 binary by jarod
AVISynth 2.5.5 (기다리면 다운로드창이 뜹니다)
MKVtoolnix (win2000/xp/2003용)
VirtualDubMod

작업과정의 자동화를 위해서 다음 유틸리티가 더 필요합니다.
forfiles.exe

AVISynth와 MKVtoolnix는 설치하고, x264.exe와 forfiles.exe는 작업 디렉토리에 넣어둡시다.
제가 사용할 디렉토리는 e:\dn2입니다.

제가 소개할 방법은 cmd창에서 명령행 x264.exe (x264 CLI)를 직접 다루는 것입니다.
직관적이지는 않지만 배치 파일을 이용한 자동화가 강점입니다.

다른 방법으로는 1) vdubmod+x264vfw를 사용하는 것과, 2) MeGUI라는 전용 툴을 사용하는 것이 있습니다.
1)은 친숙한 virtualdub 환경에 인코딩할 수 있고 directshow filter가 지원하는 모든 avi파일을 바로 읽어들일 수 있다는 장점이 있는 반면, x264vfw가 더 이상 업데이트되고 있지 않아서 최신 버전의 모든 옵션을 적용할 수 없습니다.
2)는 비교적 업데이트가 빠르고 익숙해지면 쓰기 편리한 반면, x264 최신 버전과는 여전히 거리가 있고 AVISynth 최신 버전과 호환되지 않으며 자동화가 조금 불편합니다.

[과정 1] x264.exe의 사용법

x264.exe --longhelp를 치면 사용법이 죽 나옵니다. 텍스트 파일로 저장하고 다시 열어 보도록 합시다.

e:\dn2>x264 --longhelp > x264_help.txt
e:\dn2>x264 --longhelp
x264 core:54 svn-604
Syntax: x264 [options] -o outfile infile [widthxheight]


Infile can be raw YUV 4:2:0 (in which case resolution is required),
or YUV4MPEG 4:2:0 (*.y4m),
or AVI or Avisynth if compiled with AVIS support (yes).
Outfile type is selected by filename:
.264 -> Raw bytestream
.mkv -> Matroska
.mp4 -> MP4 if compiled with GPAC support (yes)

Options:
...
일단 Syntax:를 보면 사용법이 나와 있군요. 입력이 가능한 파일로는 압축안된 raw YUV, MPEG(YUV4)가 있고, AVIS도 된다고 하네요. AVIS가 뭔지는 다음에 알아봅시다.

많은 옵션이 눈을 어지럽게 하는데요, 전부 설명하기는 어렵습니다. 아는 것도 별로 없고;;
지니님 블로그http://blog.naver.com/bobaejin2?Redirect=Log&logNo=150002312599를 참조했습니다.
옛 버전과 옵션 이름이 바뀐 것이 있어 일일이 맞춰보느라 조금 힘들었습니다.
아무튼 주목할 옵션은 다음과 같습니다.

--keyint 250
--scenecut 60
--bframes 3
--b-pyramid
--deblock 1:1
--ref 6
--qcomp 0.7
--partitions all
--direct temporal
--weightb
--me umh
--subme 6
--b-rdo
-8
-t 1

여기에 bitrate, 1 pass/2 pass, stats 파일 이름이 들어갑니다.

[과정 2] AVISynth의 사용법

AVISynth는 avi파일을 자유자재로 편집할 수 있는 스크립트 언어입니다.
형식은 텍스트 파일, 확장자는 .avs이고 일반 .avi과 똑같이 재생할 수 있습니다.
자세한 사용법은 설치 후 프로그램 폴더에 들어있는 <AviSynth Documentation>을 읽어보시기를.

여기에서 작성할 Gundam_01.avs의 내용입니다. 사운드 스트림을 제거한 .avi를 새로 만들지 않아도 간편하게 비디오 스트림만 인코더로 넘겨줄 수 있습니다. 미디어 플레이어로 재생하면 소리만 없는 채로 잘 나옵니다.
AVISource("e:\ani\Gundam_01.avi").KillAudio


[과정 3] VirtualDubMod로 사운드 스트림 빼내기

나중에 MKVtoolnix로 영상과 합칠 사운드를 원본에서 뽑아내야 합니다. VirtualDubMod를 실행하고 원본 .avi를 연 다음 메뉴에서 [Streams]-[Stream list]-[Demux]를 클릭합니다. MP3/AC3 등등 원본 형식 그대로 뽑아줍니다. Gundam-01.mp3로 저장하면 충분합니다.

※ VirtualDub에서 wav 형식으로 뽑아내면 나중에 mkvtoolnix에서 합쳐지지 않습니다. 꼭 VirtualDubMod를 쓰세요.

[과정 4] 실제 인코딩

다음 배치 파일을 만들어서 실행합니다.

start /low /b /wait x264.exe --keyint 250 --scenecut 60 --bframes 3 --b-pyramid --deblock 1:1 --ref 6 --qcomp 0.7 --partitions all --direct temporal --weightb --me umh --subme 6 --b-rdo -8 -t 1 --pass 1 --stats gundam_01-1.stats --progress -o gundam_01-1.mkv gundam_01.avs
start /low /b /wait x264.exe --keyint 250 --scenecut 60 --bframes 3 --b-pyramid --deblock 1:1 --ref 6 --bitrate 473 --qcomp 0.7 --partitions all --direct temporal --weightb --me umh --subme 6 --b-rdo -8 -t 1 --pass 2 --stats gundam_01-1.stats --progress -o gundam_01-2.mkv gundam_01.avs
이제 1패스, 2패스 인코딩이 끝나기만을 기다리면 됩니다.

473kbps로 인코딩하면 640x480x23.97fps 23분짜리 영상이 대락 85mb정도로 맞춰집니다.
결과물로 gumdam_01-2.mkv가 튀어나옵니다.

※ start 명령에 /low 옵션은 idle priority를 부여합니다.
※ start 명령에 /b 옵션은 하나의 cmd창에서 실행시킵니다.
※ start 명령에 /wait 옵션은 앞선 프로세스가 끝날 때까지 다음 프로세스의 실행을 지연시킵니다.

[과정 5] 합치기

제 시퓨가 보급형인 관계로 아직 인코딩이 완료되지 않았지만, mkvtoolnix에 포함된 mkvmerge GUI로 불러들여 하단의 [Start muxing] 버튼을 눌러 합치기만 하면 됩니다. 불러들일 때는 비디오든 사운드든 관계없이 [Add] 버튼으로 추가합니다.


[과정 Special] forfiles를 이용한 자동화

다음 명령행을 써서 모든 .avi에 대하여 간편하게 만들 수 있습니다. (퍼스트 건담은 총 43화입니다)
forfiles /m *.avi /c "cmd /s /c echo AVISource("@path").KillAudio > @fname.avs"
이렇게 하면 Gundam_01.avs~Gundam_43.avs가 생깁니다. 절대경로를 포함하도록 만든 .avs여서 작업 디렉토리로 옮겨도 에러가 생기지 않습니다.

enc_p1b.bat: 1패스용 배치 파일(비트레이트 입력)
start /low /b /wait x264.exe --keyint 250 --scenecut 60 --bframes 3 --b-pyramid --deblock 1:1 --ref 6 --qcomp 0.7 --partitions all --direct temporal --weightb --me umh --subme 6 --b-rdo -8 -t 1 --pass 1 --stats %1-1.stats --progress -o %1-1.mkv %1.avs

enc_p2b.bat: 2패스용 배치 파일(비트레이트 입력)
start /low /b /wait x264.exe --keyint 250 --scenecut 60 --bframes 3 --b-pyramid --deblock 1:1 --ref 6 --bitrate %2 --qcomp 0.7 --partitions all --direct temporal --weightb --me umh --subme 6 --b-rdo -8 -t 1 --pass 2 --stats %1-1.stats --progress -o %1-2.mkv %1.avs

enc_allb.bat: 1&2패스 통합 배치 파일(비트레이트 입력)
forfiles /M *.avs /c "cmd /c enc_p1b.bat @fname && enc_p2b.bat @fname %1"

이제 enc.allb.bat [bitrate]를 실행하기만 하면 현재 디렉토리에 들어있는 모든 .avs를 자동으로 재인코딩합니다.

※ 굳이 파일을 여러개로 나누는 것은 스크립팅의 편리합도 있지만, 무엇보다 cmd.exe가 253자 이상의 인수를 받아들이지 못하기 때문입니다.

※ 그런데 x264 정말 인코딩 느리네요. 멘체스터 4200+로 갈아타고 싶은 욕망이 무럭무럭 들게 만듭니다.

출처 : MultiFlatfrom 게임서버 도전기.ㅋ
글쓴이 : ryan 원글보기
메모 :

+ Recent posts