[Linux]本気でキツイPCでMpeg4動画をほぼ満足に再生させる設定(というかやったこと)


シャープの傑作モバイルPJ2でXviD動画を再生させました。
PS2/ドリームキャストが現役の頃の古いPCですが、チップセット統合ではないビデオチップを利用しており、普段の画面表示でメインメモリの帯域を食いつぶさないのが特徴です。
つまりCPU/メモリ帯域に高負荷をかけるビデオ再生も、十分に可能ではないかと思いました。


再生可能だった動画形式

  • SDサイズのDivX/Xvid(Homeプロファイル)
  • 動画サイズは704x396もしくは640x480で確認
  • ビットレートは2.5Mbps(ピークは4Mbps程度)
  • Qpel/GMCは使わない
  • 音声形式MP3/AAC(MP3の方がいくぶん再生が軽い)
  • コンテナ形式(AVI/MP4)

#テスト用動画はXvid/QT2.5/Bフレーム有/Motionsearch6/VHQ4、つまりQT2.5での最高画質設定のものを使用

PCスペック

  • 素のPC-PJ2-S3
  • CPU MobileCeleron-333Mhz/キャッシュ128KB
  • MEM 64MB
  • GPU Cyber9225DVD/PCI(Vram2.5MB内蔵)
  • HDD 6GB(ATA-33接続)

#完全ファンレス、11インチでSVGAという大きめのシャープのブラックTFT液晶以外は、今となっては分解リサイクル行きのPCです。
#でも目にやさしく疲れません。

OS環境

  • OSはDebian-Etchコマンドライン版をネットワーク経由でインストール
  • ウインドゥマネージャはBlackBox
  • SMBネットワーク接続用と、漢字FEP以外のデーモンは全て止める(OS起動が早くなる)
  • HDDアクセスでDMA(U-ATA33)が効くように設定する(あるとないでは大違い)。

#このあたりを検索してクリアできないようであれば辞めるのが無難です。
#Lennyは試していません(同じ環境にするまで何時間かかるかわからない)。

必要なパッケージ

  • MPlayer本体
  • XV関係のライブラリ
  • SDLライブラリ
  • ALSA関係のパッケージ
  • Xorgのビデオドライバー

#これらのパッケージは-Osオプションをつけてmakeすることをお勧めします。
#遅く、また2次キャッシュが少ないCPUなので、動画データをメモリに読み込む際の起きる『キャッシュが汚染』によって、バイナリコードがキャッシュアウトしないことが、動画再生上の高速化につながります。
#MS-DOS時代のPC9821の486CPUでのゲーム製作を思い出します(懐かしい。

xorg.confの設定

  • Moduleセクションは、XVの機能をもつ"extmod"以外をコメントアウトする。
  • Deviceセクションに"VideoRam 2560"とVRAM2.5MBと正確に記述する
  • 画面解像度は16ビット/SVGA

.mplayer/configの設定

#SDLライブラリを経由させることで多少高速になる(フレームの書換が見えちらつくのが軽減する)
vo=sdl			#SDLライブラリは、内部でxvとalsaを呼び出している
ao=sdl
#vo=xv			#xvidixなど使えるPCではそちらも試してみてください
#ao=alsa

#libavcodecの設定(DivX/XviDのデコードが多少高速になる)
lavdopts=bug=0:fast=1	#各種MPEG4コーデックのバグ処理を省く/そのものずばり高速化
noslices=1			#縦横16で割り切れない動画での端の処理を省く(or slower?ともdocに書いてある)

#色調補正(オーバーレイの色を調整する)
#PJ2の場合TVスケールの動画をPCスケールに輝度の伸張を行う為に設定する
#vf=eq=0:14			#輝度/コントラストの指定、整数で-100〜100(MMXoptimaized)
vf=eq2=1:1.13:0:1.8		#ガンマ/コントラスト/輝度/色の濃さ(実数指定、遅いが綺麗)
framedrop=1		#色調補正をしない場合は必要ない

#brightness=1		#ビデオカードのHWオーバーレイが対応していればこちらを使う
#contrast=16		#数値は詰めていない(PJ2は未対応)


#ビデオの表示設定(フレームの書き換えが見えないように設定する)
#vsync=1			#Vsyncを待ち書き換える(LCDの場合無駄かも)
double=1			#ダブルバッファリング処理
dr=1				#ビデオバッファー(VRAM?)へのダイレクト書き込み

#cache=4096			#動画データをあらかじめ読み込むメモリ量 ストリーミング以外で効果なし
quiet=1				#標準出力へのコメント量を抑える
#realyquiet=1		#コメントを一切出力しない

PJ2で実使用上での問題点

  • ビデオオーバーレイはYV12/YUV2の二種しか使えない
  • ビデオオーバーレイはPCスケール表示。

#メモリ帯域を考えるとYV12の一択になる(MPEGは基本的にYV12でまったく問題ない)。また、テレビ同様明るく表示する場合は、色調補正しTVスケールに近づけるるか、エンコード時にあらかじめPCスケールに伸張したり色合い設定する必要がある。

  • 横解像度768ドット以上の動画を再生させると、オーバーレイ画面が崩れる。
  • フルスクリーン再生時汚い(オーバーレイの拡大が多分ポイントサンプル方式)。

#横解像度制限は、メモリの量や、当時の事情(DVD再生が可能な機能を盛り込む->横720程度のオーバーレイが可能であればよい)から察するとしょうがないと思います。
#フルスクリーン再生が汚いのでフルスクリーンにしてはいけません。

最後に

AvelLinkPlayer用のHD動画を作る過程で、元の動画をフィルタリング処理した中間データができあがります。これを利用しHD動画とSD動画、そしてPJ2用と三種類エンコードしています。
PJ2用は再生できるかどうかを試してみるという面が強かったのですが、きちんと専用エンコードすると、フレーム落ちなど一切なく快適に再生できます。
linuxでのmplayerは、Win98SE上のMPCやmplayerとは比較にならないほど小型高速で、十分満足できる再生が可能です。


ただしお勧めしません。
ここまでの設定が疲れすぎる....。