Friday, January 08, 2010

Complete guide สำหรับการ Convert หนัง HD ทีเป็น MKV มาเล่นบน PS3 พร้อมมี Subtitle ไทย

ขอจดทิ้งไว้จะได้ไม่ลืม มันลืมๆรายละเอียดทุกทีเลยเวลาจะทำ อันนี้เป็นวิธีการที่ทำแล้วสำเร็จบน Ubuntu Linux 9.10 (Karmic Koala) แต่จริงๆจะทำบน Windows ก็ได้ (ง่ายกว่าด้วย) โดยเอาหนังวางไว้บน External HDD อะไรก็ได้ที่ใหญ่พอ

อันนี้เป็นวิธี Convert หนัง HD ใน Format MKV (H264+DTS|AC3) ให้เป็น Format ที่เล่นได้บน PS3 พร้อม Subtitle ภาษาไทย

สั้นๆก่อน จริงๆแล้วการเล่นหนัง HDบน PS3 มันมี 2 ทาง ทางแรกคือไฟล์ MP4 ซึ่งพวก Anime Fansub จะชอบแจกแบบนั้น MP4 ใช้ได้ดีและมีซับไตเติ้ลแยกได้ (ไม่แน่ใจว่าภาษาไทยเวิร์คหรือเปล่านะ) แต่ปัญหาหลักคือไฟล์ MP4 มันต้องเป็นไฟล์ๆเดียว ทำให้ไฟล์วีดีโอยาวๆ 2 ชม. จะไม่สามารถเก็บลงบน External HDD ที่เป็น FAT32 (ขนาดไฟล์สูงสุด 4GB) ได้ ซึ่งปกติหนัง 720p ที่เป็น H264 MKV มักจะขนาดประมาณ 6GB ถ้า 1080p ก็ 8GB หรือมากกว่านั้นอีก ทำให้ไม่มีทางเลือก ต้องเล่นด้วยฟอร์แมต AVCHD เท่านั้น เพราะ AVCHD เป็นฟอร์แมตลักษณะเดียวกับ DVD (VIDEO_TS, AUDIO_TS) คือเป็นไฟล์หลายๆไฟล์แยกกัน แต่รวมเป็นวีดีโอเรื่องเดียว ทำให้เราแยกไฟล์เป็นไฟล์ย่อยๆที่เล็กกว่า 4GB ได้ (หวังว่าปัญหานี้คงจะหมดไปเมื่อ exFAT กลายเป็นที่นิยมนะ)

อีกปัญหาของชาวไทยคือ Subtitle ถ้าไม่ติดเรื่อง Subtitle หรือคิดว่าอ่าน Subtitle อังกฤษก็ได้ ก็สบาย ไม่ต้องทำอะไรมาก แต่ถ้าจะอ่าน Subtitle ไทย ทางเลือกจะเริ่มจำกัด อย่างแรกคือจะใช้วิธีแกะ Subtitle จาก Subtitle ที่เป็นรูปภาพนี่ทำไม่ได้ เพราะ OCR Software ของไทยยังไม่ดีพอ เอา OCR ฝรั่งมา Learn ก็ไม่ได้ เพราะภาษาเรามีการตัดคำไม่เหมือนภาษาอังกฤษ ทางเลือกเลยเหลือแค่ ต้องหา Subtitle ดีๆ ใน Format ที่เป็นภาพ ซึ่งส่วนใหญ่ก็จะต้องมาจากตัวหนังของจริง อาจจะมาจาก DVD หรือ Blueray Disc (BD) ก็ได้ หรือบางทีจะมีมือเทพที่มาแปลแบบดีมาก หรือไม่ก็มานั่งพิมพ์บทแปล จากเสียงพากย์ทั้งหมด มาแปลแล้วแจกตามเน็ต ถ้าเป็นอย่างหลังเอามาเป็น Text Subtitle พวก SRT ก็ได้ แหล่งหา Subtitle ดีๆ ก็เช่น 1080ip.com และ thaidvico.com

นิดนึงคือ ตัวไฟล์ MKV นั้น ควรจะที่ Resolution ตรง หรือใกล้เคียงกับ Resolution ที่ต้องการ เช่น 1280x720 หรือ 1980x1080 เพราะว่า PS3 จะไม่ปรับให้ตัวภาพอยู่ตรงกลางจอ ถ้าเกิดว่า Resolution ของภาพไม่พอดี ส่วนใหญ่ความกว้างจะพอดี แต่ความสูงจะน้อยไป เช่น 1980x800 สิ่งที่เกิดคือภาพจะเด้งไปชนขอบบนเสมอ ตรงด้านล่างจะเป็นแถบดำขนาดใหญ่ ถ้าไม่ซีเรียสก็ไม่เป็นไร

โปรแกรมที่ใช้
  1. SmartLabs tsMuxeR - ใช้แยกและรวม Stream ในไฟล์ MKV ให้เป็น Format AVCHD สามารถรวม Subtitle stream แบบ SUP (BD Subtitle) ดาวน์โหลดเวอร์ชัน Windows หรือ Linux ตามสะดวก โปรแกรมเป็นแบบคอมไพล์แล้ว (ไม่ใช่ Open Source) แต่รันได้ปกติบน Karmic
  2. BDSup2Sub - อันนี้ใช้ Convert subtitle ใน Subpicture Format (.idx, .sub) ซึ่งถอดออกมาจาก DVD ให้กลายเป็น .SUP ซึ่งเป็น Format ที่ tsMuxeR support โปรแกรมเป็น Java เพราะฉะนั้นถ้าจะรันบน Ubuntu ต้องลง sun-java6-bin ก่อน (sudo apt-get -y install sun-java6-bin)
  3. iconv - คำสั่ง iconv ไว้ convert character encoding ในกรณีที่ไฟล์เซฟมาเป็น tis-620 (windows-874) ให้กลายเป็น UTF-8 (Linux ส่วนใหญ่จะทำงานเฉพาะกับ UTF-8 ถ้าไม่ใช่นี่จะมีปัญหาร้อยแปด)
  4. สคริปต์ Python เปลี่ยนชื่อไฟล์ที่ผมเขียนเอง เพราะ PS3 AVCHD รับเฉพาะไฟล์ที่ชื่อไฟล์เป็นแบบ Dos 8.3 เท่านั้น ถ้าบน Windows จะมีโปรแกรมชื่อ AVCHDME ใช้แทนกันได้ Content ใน สคริปต์เป็นเช่นนี้


#!/usr/bin/python

import os, re
from optparse import OptionParser

usage = '%prog [options] /path/to/avchd/dir'

opt_parser = OptionParser(usage=usage)
opt_parser.add_option('-d', '--debug', dest='debug', action='store_true', default=False, help = 'debug')

options, args = opt_parser.parse_args()

def dosname(file) :
name_map = [
('index.bdmv', 'INDEX.BDM'),
('MovieObject.bdmv', 'MOVIEOBJ.BDM'),
(re.compile(r'(?P.*)\.clpi', re.IGNORECASE) , '.CPI'),
(re.compile(r'(?P.*)\.m2ts', re.IGNORECASE) , '.MTS'),
(re.compile(r'(?P.*)\.mpls', re.IGNORECASE) , '.MPL'),
]
for src, dst in name_map :
if type(src) == type('') :
if file == src :
return dst
else :
mo = src.match(file)
if mo :
return mo.group('name') + dst
return None

def avchdme(src_path, debug) :
'''Convert file name to AVCHD with Dos short file name style for PS3'''

for ent in os.listdir(src_path) :
full_path = os.path.join(src_path, ent)
if os.path.isdir(full_path) :
avchdme(full_path, debug)
else :
newname = dosname(ent)
if newname :
src = full_path
dst = os.path.join(src_path, newname)
if debug :
print 'renaming %s to %s' % (src, dst)
else :
os.rename(src, dst)

for arg in args :
avchdme(arg, options.debug)

เอาสคริปต์มาเซฟเป็นไฟล์ชื่อ ps3me ที่ไหนก็ได้ (แนะนำ /usr/local/bin) อย่าลืม chmod a+x ด้วยจะได้รันได้ กระบวนการทั้งหมดจะใช้เวลาประมาณ 10-15 นาที แล้วแต่ขนาดไฟล์ ไม่มีการ Re-encode ไฟล์ใหม่จึงไม่เสียเวลามาก เท่าที่ลองดู พบว่าเวลาจะสัมพันธ์กับขนาดไฟล์เป็นหลัก

วิธีการทำ
  • ต่อ External HDD เข้ากับเครื่อง ซึ่งต้อง Format เป็น FAT32 เท่านั้น (ถ้าจะ Format บน Ubuntu ก็ใช้ mkfs.vfat ได้) และสร้าง Directory AVCHD ไว้ที่นอกสุด
  • ไฟล์ต้นฉบับแนะนำให้เก็บไว้บนคอมพิวเตอร์ แต่ไฟล์ปลายทางเราจะให้เขียนลงบน External HDD เลย ถ้าให้ทั้งอ่านเขียนลงบน HDD เดียวกันจะนานมาก
  • ถ้า Subtitle เป็นไฟล์ภาพ (.idx, .sub) ซึ่งจะมาคู่กัน
    • เปิด BDSup2Sub ซึ่งดาวน์โหลดมาเป็นไฟล์ .jar ด้วย Java
    • java -jar BDSup2Sub.jar
    • กด Load Subtitle file .idx หรือ .sub ก็ได้
    • ตรง Convert Resolution เลือก Format ของหนังให้ตรงกับที่ต้องการ (1080p หรือ 720p) โปรแกรมจะปรับขนาดของ Subtitle ให้ด้วย นอกนั้นทิ้งไว้คงเดิม กด OK
    • ตามประสบการณ์ พบว่าต้อง Move subtitle ทั้งหมดเนื่องจากเวลารวมแล้วจะตกขอบ ให้ไปตรง Edit->Move All Captions ตรงแกน X เลือก move to center (ดูเหมือนไม่มีผลอะไร แต่พบว่าบางที Subtitle ไปตกซ้ายสุดของจอจนตกขอบก็มี) ตรงแกน Y เลือก Keep Y Position ก็ได้ ถ้าเอาชัวร์ ให้กด move outside bounds แล้วใส่ Offset Y ไว้ที่ 50 เสร็จแล้วกด Move All
    • ตรง Windows หลัก กดเลือก Output Format เป็น SUP(BD) นอกนั้นทิ้งไว้คงเดิม
    • กด File->Save/Export โปรแกรมจะเซฟไฟล์เป็น .sup ให้ จำ Path เอาไว้
  • ถ้า Subtitle เป็นไฟล์ text (.srt)
    • ลองเปิดไฟล์ด้วย gedit ดู ถ้าพบว่าอ่านไม่ออก จะต้อง Convert ด้วย iconv ก่อน โดย
    • iconv -f tis-620 -t utf-8 -o destinatino_subtitle_file.srt source_subtitle_file.srt
    • ที่เหลือปล่อยให้ tsMuxeR จัดการทั้งหมดเลย
  • เรียกคำสั่ง tsMuxerGUI (./tsMuxerGUI)
  • กด Add ไฟล์ MKV รอสักเล็กน้อย จะ List stream มาให้เราดูว่ามีอะไรบ้าง
  • ถ้าจะ add subtitle ที่เป็น .sup ให้กด add อีกที แล้วเลือกไฟล์ .sup ของเรา ตรง Language เลือกเป็นภาษาไทย (tha พิมพ์ tha ติดกันเลยก็ได้)
  • ตรง Split & Cut ให้เลือก Split by size very แล้วใส่ 4GB
  • ถ้ามี Text Subtitle ให้ไปที่ tab subtitles แล้วเลือก Font บน Ubuntu แนะนำ Norasi ดีกว่า
  • ตรง Vertical Position ให้ติ้กตรง Bottom of Screen แล้วใส่ offset สัก 50 เพื่อจะได้ไม่ตกจอ
  • ตรงกรอบ Output เลือก AVCHD Disk แล้ว Browse directory ปลายทาง โดยเลือก /AVCHD ของ External HDD ไว้
  • กด Start Muxing แล้วรอๆๆ ไม่นานมาก พอเสร็จแล้วจะมี directory BDMV และ Certificate โผล่มาใน /AVCHD
  • เอาสคริปต์ ps3me มารัน โดยสั่ง ps3me /media/Mobile/AVCHD ทีนึง สคริปต์จะเปลี่ยนชื่อไฟล์ให้เป็น Dos 8.3 filename compat
  • เสร็จแล้วอย่าลืม Safe Remove Hardware
ทดสอบโดยการเอา HDD เสียบที่ PS3 ไปตรง Video จะเห็น USB Disk โผล่มา กด O เลือก AVCHD แล้วจะเล่นหนังทันที กดปุ่มสามเหลี่ยม เพื่อเปิด Subtitle (ภาษาไทยจะเป็น Other ตามลำดับที่ใส่ใน tsMuxeR) หรือเปลี่ยน Audio Channel ได้