2009年12月8日 星期二

Mencoder + libx264

既上一篇PSP+Mencoder+FFMPEG+X264的搭配版本之後,心有不甘,決定要好好研究一下這三者究竟是那一個出了錯,造成我轉檔失敗。

使用先前的 rip2pmp 版本時,利用 libavcodec 來轉檔時,會出現:
videocodec: libavcodec (480x272 fourcc=34363268 [h264]) [libx264 @ 0x957eaf0]broken ffmpeg default settings detected [libx264 @ 0x957eaf0]use an encoding preset (vpre) Could not open codec.
這樣子的錯誤訊息,如果直接用 libx264+mencoder 的話,卻不會出錯,可以在PC上撥放,但是放到 PSP 上時,卻顯示不支援的格式。所以這邊出現了兩個問題:
  1. mencode+lavc+libx264 的搭配
  2. libx264 轉成 PSP format 的問題
google一下問題 1. 的錯誤,會很多人說這是 libavcodec 傳遞給 libx264 的 Bug,可以參考libx264-78 的 source code 中 encoder/encoder.c:434,有一段 code 是檢查傳遞進來的encode parameter,由 code 中可以看出 ffmpeg 傳遞參數有 Bug?所以讓 libx264 多做了一段檢查(libx264-67 無這一段code)。

既然問題 1. 是木已成舟,那就轉由問題 2. 來查。

查了 libx264 的 Mailing List 後,才知道 libx264-67 和之後的版本,預設的 encode 參數有不一樣,而先前使用的 script 剛剛好符合 PSP 的 encode 模式,所以算瞎貓碰到死耗子。既然改寫了,就好好把每個參數設定好。

PSP的 x264encopt:
-ovc x264 -x264encopts bitrate=800:
global_header:
frameref=2:
bframes=3:
b_adapt:
b_pyramid=none:
weight_b:
me_range=24:
subq=7:
psy-rd=0.8,0.2:
me=umh:
level_idc=30:
threads=0:
partitions=p8x8,b8x8,i4x4:
trellis=1:
cabac:
aq_mode=1:
8x8dct=no:
chroma_me:
nofast_pskip:
nodct_decimate:
vbv_maxrate=4000:
vbv_bufsize=2500
PS3 的 x264encopt:
-ovc x264 -x264encopts bitrate=1500:
global_header:
frameref=3:
mixed_refs:
bframes=3:
b_adapt:
b_pyramid=none:
weight_b:
me_range=24:
subq=7:
psy-rd=0.8,0.2:
me=umh:
level_idc=41:
threads=0:
partitions=p8x8,b8x8,i8x8,i4x4:
trellis=1:
cabac:
aq_mode=1:
8x8dct:
chroma_me:
nofast_pskip:
nodct_decimate:
vbv_maxrate=2000:
vbv_bufsize=2000
IPOD 的 x264encopt:
-ovc x264 -x264encopts bitrate=800: global_header: frameref=1: mixed_refs: bframes=0: nob_adapt: b_pyramid=none: noweight_b: me_range=16: subq=8: psy-rd=0.8,0.0: me=umh: level_idc=30: threads=0: partitions=p8x8,i4x4: trellis=0: nocabac: aq_mode=1: no8x8dct: chroma_me: nofast_pskip: dct_decimate
感謝看官們堅持到最後,我自已也是 ffmpeg, mencoder, x264 交叉看到吐血,至少有弄出來最重要。
最後再放一個新 update 後的 script:rip2pmp-0.5.1

2 則留言:

blc 提到...

最近剛好在想辦法轉psp上的影片,看到這篇真的節省很多時間。感謝。

匿名 提到...

感謝你的文章

很久沒有轉檔給 PSP 用了,最近用新版的 libx264 + mencoder 搭配自己以前寫的 script 去轉竟然無法在PSP上播放,用你的設定果真解決了問題。 >"<