2009年2月1日 星期日

使用FFmpeg壓縮影片供PLAY-YAN播放

我有一台任天堂的GBA,和一張第一代的PLAY-YAN(プレイやん)卡匣,有時候在等車或是有空閒的時候會用它看一些影片打發時間;但是這幾天難得有空把很久以前用舊電腦轉好的影片都看完了,所以現在嘗試著要轉換一些新的影片檔。

基本上這張卡片可以使用標準的3GP格式影片,只是影片部份限制要使用MPEG4 Part 2(俗稱DivX或是Xvid)格式編碼,聲音要用AMR-WB(品質差)或是AAC-LC格式編碼,然後要用MP4 Container,但是由於硬體限制的關係不是所有MPEG4 Part 2的功能都可以使用(例如不可使用B-Frame、GMC、Quater-pixel motion等等)而且對影片的解析度與流量也有限制就是了。

所以我首先想到的是使用Ubuntu套件庫中找到的Avidemux,設定好影片解析度、選擇XviD影像編碼參數後另存MP4格式,沒想到產生的影片檔播放的時候雖然聲音正常,但畫面都不會動;而且用Ubuntu內建預設的Totem影片播放器也是一樣,但是用SMplayer或是VideoLAN卻是正常的,在不確定原因的情況下,只好嘗試其他的方案。

嘗試使用Wine執行我以前在Windows上使用的轉檔程式:携帯動画変換君,程式可以順利的執行,但是卻無法把要轉檔的影片檔拖放進程式中進行轉檔的動作,查了資料才發現這是一個Wine尚未實做的OLE功能,雖然目前已經有Patch程式,但是因為不想要自己編譯Wine所以還是乖乖等待官方版本加入這個功能吧。

只好繼續尋找Linux上的轉檔程式,找了一套叫做HandBrake的程式,網站上有提供Ubuntu使用的套件包,安裝執行後發現程式預設提供了一些預設的設定,例如iPod或是PSP用的,但是就是沒有PLAY-YAN使用的,而且使用自建設定時發現可以設定的選項不多,設定方法也不是很直覺,更糟的是轉出來的檔案雖然在電腦上播放都很正常,但是放在PLAY-YAN上時會顯示類似找不到影片檔的訊息,比Avidemux的情況更糟,只好放棄。

所以最後只得求助於命令列的程式了,因為我知道携帯動画変換君也只是FFmpeg的一個前端程式,所以就安裝了Ubuntu的FFmpeg命令列程式,然後參考携帯動画変換君使用的參數,經過一些嘗試與修改後確定這樣的參數可行:

ffmpeg -i [輸入影片檔名] -g 300 -mbd bits -flags mv4 -flags trell -sws_flags lanczos -s 240x160 -padtop 8 -padbottom 8 -b 640000 -ac 2 -ab 160000 -f mp4 [輸出影片檔名]

只是對於這樣的結果還是有不滿:

  1. 要使用命令列模式輸入,不只是麻煩而已,每當檔案或路徑名稱中有空白與特殊符號的時候還得加入反斜線(\)才能正確處理。
  2. 使用libavcodec的MPEG4 encoder,而不是Xvid的MPEG4 encoder進行影片的編碼,理論上使用Xvid在位元率低時可以得到較好的效果。
  3. 沒有充分利用多核心的CPU。

不過在找到更好的方法之前,只能先這樣了。

沒有留言:

張貼留言