สวัสดีครับ วันนี้ผมมานำเสนอวิธีการ Encode โดยใช้ MKV/MP4 แบบ VFR เผื่อเป็นอีกทางเลือกหนึ่งแทนการใช้ AVI ครับ 8) บอกก่อนว่าผมก็ยังมือใหม่มากๆ ประสบการณ์การทำแฟนซับยังไม่ถึงเดือน ผลงานมีทำไว้แล้วแต่ยังไม่ได้ปล่อยออกมา สรุปคือยังไม่มีผลงานออกมาน่ะแหละ เหอะ เหอะ แต่วิธีที่ผมจะมาบอกรับรองว่าใช้งานได้จริงแน่นอนครับไม่ต้องกังวล ไม่งั้นไม่มาตั้งกระทู้ให้เสียเวลา ก็อยากจะให้คนที่เริ่มคิดทำแฟนซับที่เป็นมือใหม่เหมือนกันได้ทราบวิธีการ จะได้ไม่ต้องไปเที่ยวหาข้อมูลตามเนตซึ่งส่วนใหญ่จะเป็นภาษาอังกฤษ บางคนอาจจะขี้เกียจอ่านอีก เอาละเรามาเริ่มกันเถอะ

วิธีที่ผมมาเสนอจะใช้ MeGUI ในการ Encode เป็นหลัก ไม่ได้ใช้ Vdub/VdubMod นะครับ ใช้ง่ายครับทำได้หลายอย่าง เป็นโปรแกรมอเนกประสงค์จริงๆ ใช้สำหรับ Encode AVC Video โดยเฉพาะ ก่อนอื่นโหลดโปรแกรมที่จำเป็นกันก่อน

MainTool
AviSynth: http://sourceforge.net/projects/avisynth2/
*ลงก่อน MeGui
MeGUI: http://forum.doom9.org/showthread.ph...ighlight=meGui
*Xvid Profile for MeGui: http://forum.doom9.org/showthread.ph...263#post841263
- ถ้าใช้ Xvid Encode แล้วมันบอกหา path ไม่เจอ ก็โหลดตัวข้างบน unzip แล้ว copy folder extra ไปวางที่ path tools\xvid_encRaw ของ MeGui
- ถ้ามันยังบอกหาไม่เจออีกให้ copy folder extra ไปวางใน path เดียวกับ Video ที่จะ Encode แทน อันนี้น่าจะเป็น bug

Timecode
Timecode คือหัวใจที่สำคัญที่สุดของ VFR เสียงจะ sync กับภาพหรือไม่ก็ขึ้นอยู่กับตัวนี้ ใช้เป็นตัวบอกอัตราการแสดง frame rate ของแต่ละช่วง
ตัวอย่าง
# timecode format v1
assume 23.976
0,1825,29.969801
1826,3264,23.976141
3265,38574,29.970030
38575,38575,58.823528

# timecode format v2
0.000000
33.000000
67.000000
100.000000
133.000000
167.000000
200.000000
...
v1 จะบอกว่าตั้งแต่ frame เริ่มต้นถึง frame สุดท้าย ให้แสดงด้วยอัตรา fps เท่าไร
v2 จะบอกว่าแต่ละ frame ให้แสดงกี่ milliseconds ต้องเริ่มต้นด้วย 0 เสมอ จากตัวอย่างคือ 1/(33/1000) = 30.3030 fps
จะเห็นว่า v1 อ่านง่ายกว่า v2 มากและบางโปรแกรมจะอ่านได้เฉพาะ v1 เท่านั้น

โปรแกรมแปลง timecode จาก v2 เป็น v1: http://www.animereactor.dk/mkv/
avi_tc_package: http://web.missouri.edu/~kes25c/#c3
Haali Media Splitter และ mkv2vfr: http://haali.cs.msu.ru/mkv/
*ถ้าใช้ CCCP จะมีอยู่แล้วไม่ต้องโหลด มันจะอยู่ใน C:\Program Files\Combined Community Codec Pack\Filters\Haali

Muxer
MKVtoolnix: http://www.bunkus.org/videotools/mkv...downloads.html
Mkvextract GUI: http://forum.doom9.org/showthread.php?s=&threadid=73819
*ต้อง copy ไฟล์ mkvextract.exe, mkvmerge.exe จาก MKVtoolnix มาไว้ใน path เดียวกันด้วย ถ้ามีอยู่แล้วก็ไม่ต้อง
MP4Box: http://kurtnoise.free.fr/mp4tools/
Yamb: http://yamb.unite-video.com/download.html
tc2mp4: http://forum.doom9.org/showthread.php?t=112199
*ต้อง copy ไฟล์ MP4Box.exe มาไว้ใน path เดียวกันด้วย เอาจากใน MeGui หรือ Yamb ก็ได้

Subtitle
Aegisub: http://www.malakith.net/aegiwiki/Main_Page

Optional
VirtualDub: http://virtualdub.sourceforge.net/
enc โปรแกรมคำนวณการบีบอัดสำหรับ XviD Profile: http://jonny.leffe.dnsalias.com/
hashcalc โปรแกรมคำนวณ hash: http://www.slavasoft.com/hashcalc/index.htm

ก่อนจะมาเริ่มทำกันก็ควรจะทราบถึงข้อดีคร่าวๆ ของวิธีนี้กันก่อน การ Encode แบบ VFR (Variable Framerate) จะช่วยทำให้ไม่เกิดการสูญเสียหรือการ duplicate เฟรมขึ้น ถ้าหาก Raw ที่ใช้เป็นแบบ VFR แล้วมาบังคับให้มันเป็น CFR (Constant Framerate) การจะรักษาให้ภาพยังคง sync กับเสียงเหมือนเดิมตัว Encoder จะต้องมีการตัดหรือ duplicate เฟรมเพิ่ม ซึ่งโดยส่วนใหญ่แล้ว Anime จะเป็น VFR แทบทั้งนั้น โดยมักจะมี 29.97 fps ผสมกับ 23.976 fps บางช่วงอาจมีถึง 59.94 fps การแปลงเป็น CFR สามารถทำได้ ผลที่ได้ก็ไม่น่าจะรู้สึกแตกต่างอะไรมากนัก ถ้าไม่สังเกตุจริงๆ บางกรณีอาจรู้สึกกระตุกบ้างแต่ก็ไม่ได้เลวร้ายอะไร แต่ในบางกรณีการแปลงเป็น CFR ตรงๆ ก็ไม่ได้ผล จะมีอาการภาพกระตุกหรือภาพไม่ sync กับเสียงเป็นต้น ขึ้นอยู่กับ Raw เป็นหลัก ถ้าเป็น 120fps AVI ก็ไม่น่าจะมีปัญหา แต่ถ้า Raw เป็น MKV แล้วยิ่งถ้าเป็น H264 ด้วยล่ะก็วิธีการก็จะซับซ้อนมากขึ้น การ Encode แบบ VFR จะตัดปัญหาในส่วนนี้ออกไปและยังคงรักษาเฟรมทุกเฟรมของ Raw เอาไว้ได้ ทำให้ภาพดูลื่นกว่าการแปลงเป็น CFR แต่ยังไงมันก็ขึ้นอยู่กับคุณภาพ Raw ด้วย เนื่องจากว่า AVI ไม่รองรับ VFR ดังนั้นการ Encode แบบนี้จึงจำเป็นต้องใช้ MKV/MP4

สำหรับ container ที่ยืดหยุ่นที่สุด ง่ายที่สุดและเหมาะที่สุด ณ ตอนที่ผมเขียนนี้ คือ MKV ซึ่งมีข้อด้อยกว่าเพียงอย่างเดียวคือการใช้งาน ได้ยินว่าเล่นบน Linux ไม่ค่อยได้ ไม่รู้จริงเปล่า ที่สำคัญคือมันไม่มี MKV Player เป็น stand alone hardware เนื่องจากไม่ใช่มาตรฐานของอุตสาหกรรมเพราะงั้นเลยต้องเล่นบน PC เป็นหลัก สำหรับ MP4 สามารถรองรับการใช้งานได้เหมือนๆ MKV แต่ว่ายังมี tool มารองรับน้อยกว่า โดยเฉพาะเรื่อง subtitle ตัว MP4 มี format มาตรฐานของตัวเอง คือ TTXT ไม่รองรับ ASS ทำให้ใช้ softsub format ASS ไม่ได้ ตอนนี้ยังไม่มี TTXT Editor/Converter ออกมา และยังไม่มี tool ช่วยให้ฝัง font ได้ด้วย ดังนั้นการทำ hardsub จะดูเป็นทางออกที่เหมาะสมที่สุดหรือกลับไปใช้ softsub format แบบเก่าเช่น SRT

ข้อเสียของ VFR คือถ้าหากมีช่วงที่ frame rate สูงมากๆ เช่น 60fps ถ้าเป็น H264 จะทำให้ CPU Load ได้ครับ อาจจำเป็นต้องตัด frame ส่วนนี้ออกบ้าง โดยการ decimate ปกติแล้วส่วนที่เป็น 60fps จะเป็นช่วงที่เป็นรายชื่อ staff ขึ้นตอน ED หรือคำเตือน คำประกาศต่างๆ ก็ขึ้นอยู่กับคน Encode ถ้าไม่ถืออะไรมากจะตัดไปก็ไม่เป็นไรครับ

เริ่มต้นด้วยการ load Raw มาก่อนครับ

VFR ใน MKV
XviD/DivX
1.ใช้ mkv2vfr ที่อยู่ใน installed folder ของ Haali Media Splitter ดึง timecode ออกมา พิมพ์ใน dos เอาหรือสร้าง .bat ไฟล์มารันบน window explorer ก็ได้
mkv2vfr.exe input.mkv output.avi timecode.txt
จะได้ output.avi พร้อมกับ timecode ออกมา
2.เอา Raw avi ที่ได้โหลดเข้า Aegisub แล้วกด Video -> open timecode โหลด timecode ที่ได้เข้าไป โหลดเสียงจากตัว raw ต้นแบบได้เลย
3.ทำซับเสร็จแล้วกด export เลือกเป็น variable framerate
4.เปิด notepad เขียน script ตามนี้ แล้ว save เป็น .avs
LoadPlugin("C:\Program Files\Aegisub\VSFilter.dll")
DirectShowSource("C:\Rawpath\Raw.avi",convertfps=false).TextSub("C:\subpath\HardSub.ass").converttoyv12()
จะเป็นการทำ hardsub สามารถใช้ AVISource แทนได้แต่แบบนี้รองรับ H264 ได้ด้วย ***ต้องใช้ตัว Sub ที่ export มาจาก Aegisub นะครับ***
5.ใช้ MeGui เปิด avs แล้วดู preview ว่าภาพ sync กับ sub หรือไม่ ดูตรง karaoke จะง่ายที่สุด เลือก Codec เลือก Profile เลือก Container จากนั้น กด Enqueue หรือ AutoEncode
5.1กด Enqueue จะเป็นการ Encode อย่างเดียว แล้วต้องมา mux เองอีกที
5.2กด AutoEncode จะเป็นการ mux ไฟล์อื่นให้ด้วย เช่น Audio, Soft Subtitle และสามารถควบคุมขนาดไฟล์ได้ แต่ถ้าจะใส่ Soft Subtitle แนะนำว่าอย่าเพิ่งใส่ เพราะ MeGui มันไม่รองรับ ASS โดยปกติผมจะใช้ AutoEncode เพื่อจำกัดขนาดไฟล์เท่านั้น แล้วค่อยมา re-mux อีกทีครับ เนื่องจาก MeGui ไม่รองรับการ attach timecode สุดท้ายเราจะได้ Video ที่เป็น CFR ออกมา
H264
1.ใช้ Mkvextract ที่อยู่ใน folder Mkvextract GUI ดึง timecode ของ Raw MKV ออกมาแล้วใช้ convert-timecodes แปลง timecode ให้เป็น v1 พิมพ์ใน dos เอาหรือสร้าง .bat ไฟล์มารันบน window explorer ก็ได้
mkvextract timecodes_v2 "Raw.mkv" 1:"v2tc.txt"
convert-timecodes v2tc.txt v1tc.txt
2.ใช้ Mkvextract GUI ดึงเอา Raw H264 ออกมาก่อน จะได้ไฟล์ .264
3.เปิด MeGui Tools -> Muxer -> AVC2AVI โหลดไฟล์ .264 ที่ได้อย่างเดียว ใส่ fps เท่าไรก็ได้เพราะไม่ใช้อยู่แล้ว กด mux จะได้ Raw H264 ใน AVI มา
4.ทำเหมือนของ Xvid/DivX ตั้งแต่ข้อ 2 ลงมา

120fps AVI
มาถึง raw ยอดนิยมกัน
1.ใช้ tc-Gui ใน avi_tc_package ดึง Raw AVI กับ timecode ออกมา
ถึงตอนนี้บางคนอาจจะงงว่ามันดึงอะไรออกมาละ คำตอบคือว่ามันดึง Raw AVI ที่ทำการตัด frame ที่ไม่จำเป็นออกมา บางคนอาจสงสัยว่าไหนบอกไม่มีการสูญเสีย frame ไง คำตอบคือจริงๆ แล้วตัว Video มันมี frame rate ไม่ถึง 120fps หรอกครับ แต่เนื่องจากว่าในตัว Video เป็น VFR ดังนั้นการจะจุลง AVI ได้ต้องแปลง frame rate ก่อน จึงมีการใส่ frame ว่าง (null frame) ลงไปใน Video ครับเพื่อให้ fps คงที่แล้วจึงใส่ลง AVI ได้ ปกติไฟล์พวกนี้น่าจะมี frame rate 3 ช่วง คือ ปัดขึ้นนะครับ 24fps, 30fps, 60fps หาค.ร.น. 24*5, 30*4, 60*2 ก็จะได้ 120fps คงที่ครับ ลองสังเกตดูในไฟล์ timecode ได้ สรุปคือขั้นตอนนี้จะเป็นการตัด null frame ออกไปให้หมด เหลือแต่ภาพ Video จริงๆ และถ้าเอาไฟล์นี้ไปเปิดรับรองว่าภาพไม่ sync กับเสียงแน่นอนครับ
2.เอา Raw avi ที่ได้โหลดเข้า Aegisub แล้วกด Video -> open timecode โหลด timecode ที่ได้เข้าไป แล้วจากนั้นก็ทำเหมือนเดิมครับ
*หากต้องการทำเป็น CFR ก็สามารถโหลด 120fps raw เข้าไปทำซับใน Aegisub ได้เลย แต่ให้ใช้ script avs ตามนี้
LoadPlugin("C:\Program Files\Aegisub\VSFilter.dll")
DirectShowSource("C:\Rawpath\120fpsRaw.avi",fps=29.97,convertfps=true).TextSub("C:\subpath\HardSub.ass").converttoyv12()
*เป็นแค่ตัวอย่างหนึ่งในการแปลงเป็น CFR ครับ ลองหาอ่านวิธีอื่นดูละกัน

MKV
หลังจากขั้นตอนที่ Encode จาก MeGui ได้ไฟล์ MKV มาแล้ว ให้ใช้ mkvmerge ใน mkvtoolnix มา re-mux timecode ตัวเดียวกับที่ใช้ใน Aegisub ลงไปใน Video อีกทีครับ (เลือกที่ stream Video -> track options -> timecodes) ใส่เสียงลงไป (set delay ได้ที่ specific option) ถ้ามี softsub ก็ใส่เข้าไปด้วย แล้วอย่าลืม attach font ที่ใช้ด้วยล่ะ กด mux แล้วก็เอาไป QC ต่อได้ครับ

MP4
หลังจากขั้นตอนที่ Encode จาก MeGui ได้ไฟล์ MP4 มาแล้ว
1.ให้ใช้ tc2mp4 remux อีกที โดยใช้ timecode ตัวเดียวกับที่ใช้ใน Aegisub เช่นกัน พิมพ์ใน dos เอาหรือสร้าง .bat ไฟล์มารันบน window explorer ก็ได้
tc2mp4 -i inputcfr.mp4 -t v1tc.txt -o outputvfr.mp4
2.เข้า Yamb หรือ MeGui tools -> muxer -> MP4 ก็ได้ เอามา mux เสียงรวมเข้าไป เสร็จแล้วก็เอาไป QC ต่อได้ครับ

เสร็จแล้วครับมีอะไรไม่เข้าใจถามได้ครับ แต่อาจจะตอบไม่ได้ทุกคำถามนะครับ ถ้าว่างๆ ผมจะ capture หน้าจอมาให้ดูละกัน

ในส่วนของ Profile การ Encode ใน MeGui มีรายละเอียดตามนี้ครับ
x264 Profile
Profiles for maximizing Quality and hit a desired bitrate/filesize (2 or more passes, SLOW encoding, High Profile)
HQ-Slow: Pretty slow but not much. Quality is near the best.
HQ-Slower: Slower than HQ-Slow but it tries to squeeze some more compression thru the use of more reference frames.
HQ-Slowest: Same as HQ-Slower with more reference frames.
HQ-Insane: All settings maxed out.

Profiles for Common Encoding (2-passes)
CE-HighProfile: Common settings using high Profile options (not compatible with QuickTime)
CE-MainProfile: Common settings using main Profile options (not compatible with QuickTime)
CE-QuickTime: Common settings for QuickTime 7 compatibility.
CE-Baseline: Common settings using baseline Profile options (100% compatible with QuickTime 7)

Profiles for maximizing Speed and hit a desired bitrate/filesize (1-pass)
1P-Maxspeed: Everything disabled for max encoding speed (good for live capturing).
1P-Intermediate: Intermediate settings for average speed and final quality.
1P-Goodquality: Settings for good quality with 1 pass.

Profiles for constant Quality/Quantizer (1-pass)
CQ-Lossless: Lossless encoding.
CQ-ASP_Q2_equiv: Almost the equivalent of MPEG-4 ASP Q2 encoding.
CQ-ASP_Q2_eq(crf): Same as above but with "constant quality" (constant rate factor).

Profiles for Anime/Toons (2 passes)
AE-Standard: 2 passes, Main Profile, standard quality.
AE-Goodquality: Slower than AE-Standard, High Profile, higher quality.
AE-Maxquality: Slowest mode with maxed out settings, best quality.


Profiles for Consoles and Portable Devices
PD-PSP: Profile for Sony PSP playback.
PD-Xbox_Hires: Profile for MS XBOX and higher than 512pixels resolution (latest XBMC is needed).
PD-Xbox_LoRes: Profile for MS XBOX and lower than 512pixels resolutions (latest XBMC is needed).
PD-iPod: Profile for iPod Video based on Arstechnica settings.
PD-iPod 5.5G: Profile for the new iPod 5.5G.

Profiles for HD-DVDs
SA-HD-DVD: First EXPERIMENTAL Profile for HD-DVD.

XviD Profile
ผมยังไม่เคยทำ เพราะผมใช้ x264 แต่จะแปลวิธีเลือกมาให้ครับ ได้ผลยังไงมาบอกกันหน่อยก็ดีครับ
1.รัน enc โปรแกรมคำนวณการบีบอัด
2.ใส่ path VirtualDub กับเปิด .avs ที่ใช้ขึ้นมา
3.เลือก compressibility test ใส่ขนาดไฟล์ที่ต้องการ เลือก extend
4.configure XviD
- single-pass
- constant quantizer=3
- กด more ที่ Profile @ level เลือก MPEG-Custom -> Edit Matrix -> load Didees SixOfNine.cqm ใน Xvid Profile ที่โหลดมาตอนแรก
- เลือก B-VOPs: Max consecutive BVOPs=2, Quantizer ratio=1.62, Quantizer offset=0 ส่วนที่ไม่ได้พูดถึงให้เอาออก กด OK
- กด Advance: precision=4, VHQ=off, Trellis=on, Turbo=on ส่วนที่ไม่ได้พูดถึงให้เอาออก กด OK กด OK
5.กด New job -> Start all jobs ดูผลการคำนวณการบีบอัด
6.เลือก XviD Profile ให้บีบอัดใกล้เคียงกับผลที่ได้หรือจะข้ามขั้นตอนมาเลือกเอาเองเลยก็แล้วแต่
*enc สามารถใช้ช่วยคำนวณการบีบอัดในกรณีทั่วๆ ไปก็ได้ ไม่จำกัดว่าต้องเฉพาะกับ Profile XviD ใน MeGui เพียงแต่ต้อง configure ค่าให้ตรงกับที่คุณใช้
*CQM = Custom Quantization Matrix เป็นค่าที่ตัว Codec ใช้สำหรับการบีบอีด มีผลโดยตรงต่อคุณภาพของ Video
*วิธีนี้มีข้อเสียคือการใช้ CQM ไม่ได้ใช้ H263 ที่เป็น Quantization Matrix มาตรฐาน ถึงจะใช้ AVI ก็อาจจะเอาไปเปิดในเครื่องเปิดไม่ได้ แต่ดูบน PC ได้ไม่มีปัญหา
*XviD Profile ข้อมูลเพิ่มเติม: http://forum.doom9.org/showthread.php?t=119399

จริงๆ แล้ว MeGui สามารถสร้าง script avs ให้เองได้ด้วย ลองเอาไปเล่นกันดูละกันครับ ผมก็ยังใช้ไม่ครบทุก function เลย

Credit: TheFluff from Animesuki forum, Doom9 forum

Edit:
1.ลืมบอกครับว่าถ้าจะใส่ soft sub ไม่ต้อง export ตัว sub ออกมาจาก Aegisub นะครับ สามารถ save แล้ว mux เข้าไปตอนหลังจาก Encode แล้วได้เลย
2.ขอตัดประโยคที่บอกว่าใช้ VDub แทนได้นะครับ ลืมไปว่า VDub มันทำ MKV/MP4 ไม่ได้
3.เพิ่มเติมการ setup MKVextractGUI
4.timecode ที่ได้จาก avi_tc_package จะเป็นแบบนี้
# timecode format v1
Assume 29.970030
1706,3144,23.976024
38455,42632,59.940060
# Total Frames: 43085
จะเห็นว่ามีเฟรมบางช่วงขาดหายไป โปรแกรมที่อ่านจะถือว่าช่วงเฟรมที่ขาดไปจะใช้ค่า frame rate ตามค่าที่ assume ไว้ แต่บางโปรแกรมจะไม่รู้ครับ เช่น tc2mp4 ถ้าจะเอาไปใช้กับ tc2mp4 ให้เพิ่ม frame rate บรรทัดสุดท้ายไปด้วยครับ กรณีนี้ คือ 42633,43084,29.970030 เสร็จแล้วก็ save ถ้าไม่ทำแบบนี้ Video ที่ได้จะขาด frame ส่วนสุดท้ายไป
5.บอกผิดนิดหน่อยครับ เรื่อง CFR สามารถฝังซับที่ทำใน Aegisub ได้เลยครับ ไม่จำเป็นต้อง export ออกมา ***แล้วก็สามารถทำซับกับ raw ตรงๆ ได้เลย ไม่ต้องโหลด timecode***
6.เพิ่มเติมอีกนิดตอนที่กำหนดขนาดไฟล์ใน MeGUI จะเห็นว่าตอนนั้นยังไม่มีการ mux Audio เข้าไปด้วยนะครับ เพราะฉะนั้นขนาดที่กำหนดเป็นการกำหนดขนาดของไฟล์ Video อย่างเดียว ยังไม่ได้รวมขนาดไฟล์ Audio นะครับ
7.แนะนำเพิ่มอีกหน่อยสำหรับ XviD Profile สรุปง่ายๆ คือยิ่งเลขมาก ภาพก็ยิ่งคุณภาพสูงมากขึ้นครับ