2010/02/08

[Nokia N810] gstreamer(gst-ffmpeg) vs mplayer (SVN-r30479-3.4.4)でH.264+aac再生対決 (1)

wayv
どうもみなさんボンジュール

最近は動画共有サイトに高画質化の波が押し寄せてきているようで、N810ではちょっとつらい場面も増えてきたのでいろいろ試行錯誤しました。
結論からいえば、gstreamerの勝ち。しかし試合に勝って勝負に負けた感じ。
判りやすく言うと、gstreamerもmplayerも力不足でした。

収穫はmplayerでamr(nb/wb)が再生できるようになったこと。
よくあるガラケーの.3gpで音が出るようになります。
(標準のmediaplayerでは前から再生できたけど、あんなの重くて使ってられません。)
動画を文字列で表示する、いわばaalib(http://aa-project.sourceforge.net/gallery/)のカラー版、libcaca(http://caca.zoy.org/)をくっつけてみたりもしました(↑↓)。

wayv
縮小するとわかりやすい

カメラと繋げば、コレが拡張現実(http://www.youtube.com/watch?v=WR2GUWrxTmU)ってやつだ!(ネオ的な意味で)。
wayv
某アニメ風にZaurus

N8x0とおなじCPU(OMAP2420)を搭載したガラケーでH.264再生してたりしますし、
PowerVRMBXといっしょにIVAもオープンになったらもうちょっと望みが出てくるのかも。


まずgtreamer。
よさげなフロントエンドがなかったので*1、今回はコマンドラインからgst-launchを使います。
gst-lauchはべつだん動画再生ソフトという訳ではないので
  • シークや音量調節ができない
  • 今回はffmpegを使うので結局中身はmplayerと同じ(むしろバージョンが古い)
などはっきり言って良いとこ無しなのですが、
修造本気出せ
N810でのgstreamerにはmplayerにはない大きな利点がひとつあります。

そう、dspmp3sinkやdspaacsink、dsppcmsinkなどのエレメントから、dspにアクセス出来るのです。
たとえばmp3ではmplayerの固定小数点化されたlibmadと、dspでの再生に大きな差はないのですが、
これがaacとなると、現状手に入るmaemo向けmplayer(libfaad)ではやたらとCPUを食います。
ただでさえ重いh264ですので、少しでも他の計算は少なくしておきたいところです。
(ただし、フツーのカーネルではdspを使っている間cpuクロックが330Mhzに固定されるので、トレードオフではある)

さっそくやってみます。
最初から入っているgst-ffmpegはいろいろ機能が削除されているので、ここ(http://www.gstreamer.net/src/gst-ffmpeg/)からソースを手に入れてbuildします。
といってもあまりに新しいとgstreamer本体のバージョンが古すぎて怒られるのでちょい古めをチョイス。今回は0.10.2ぐらいにしておきました。
展開してconfigureし、いざmake、といきたいところですが
ここでMakefileに魔法の呪文を追加します。
-mfpu=vfp -mfloat-abi=softfp -mcpu=arm1136jf-s
これらをgccの引数にするとすこしだけarmに最適化されるらしいです。
バイナリサイズは確実に小さくなりますね。(Autobuilderでつくったバイナリのサイズが自前ビルドと変わるのはコレのせい?)
for FIL in `find . -name Makefile` ; do cp $FIL $FIL.bak ; sed -e "s/-O2/-O2 -mfpu=vfp -mfloat-abi=softfp -mcpu=arm1136jf-s/g" $FIL.bak > $FIL ; done
こんなかんじで大雑把にやりましたが、環境変数とかで一括指定する方法がある気もする。
makeできたら、
mv /usr/lib/gstreamer-0.10/libgstffmpeg.so /usr/lib/gstreamer-0.10/libgstffmpeg.so.old.maemo
として、 gstreamer0.10-ffmpeg-ossoのバックアップをとり、
mv .lib/libgstffmpeg.so /usr/lib/gstreamer-0.10/ 
で出来上がったlibgstffmpeg.soを/usr/lib/gstreamer-0.10に放り込んでいよいよ再生。
gst-launch filesrc location=hyper_egashira_kousien_2nd_008.flv ! ffdemux_mov_mp4_m4a_3gp_3g2_mj2 name=demuxer demuxer. ! queue ! ffdec_h264 !xvimagesink force-aspect-ratio=yes demuxer. ! queue ! dspaacsink
うーん。試してみたのは512x288/H.264/128kAACで動きの少ない動画だったのでそこそこいけましたが、動きの激しいシーンではだいぶコマ落ちしました。
好印象だったのは再生速度が変わらないところですね。
mplayerだと間延びしたように音声の再生がおくれるのですが、gstreamerだと映像と音声がずれません。
ファイル: libgstffmpeg.so.gz


*1Totem以外にも日本の方が作られているYuumo(http://www.ryuuo.com/movie/)なんてのがありますが、多分一番シンプルなのはMarc-André Lureauさんが書かれてFelipe Contrerasさん(http://felipec.wordpress.com)がメンテしているgst-player(http://github.com/felipec/gst-player)。
gnome関連のライブラリがいらなくてmakeは楽チン、Youtubeのflvだとかvimeoのmp4はdspを使って再生してくれますし、シークもできますが、今回再生した動画とはどうも相性がわるいようでした(自動判別が失敗する)。
もちろん使い分ければ便利です。フルスクリーンキー(F6)が効くようにしたバイナリをおいておきます。使いかたはgst-player /path/to/yourfile.hoost.ernesto
ファイル: gst-player.gz

以下もっと余談。Felipe氏はgst-omapfb(http://github.com/felipec/gst-omapfb)なんてのにも関わっていて、こりゃ便利そうだとmakeしてみたのですが、N810では岸辺露伴ばりに動きません。

#gst-launch ~~~ ! omapfbsink
Setting pipeline to PAUSED ...
ERROR: Pipeline doesn't want to pause.
Setting pipeline to NULL ...
FREEING pipeline ...

どうやらフレームバッファのmmapで失敗してるようなので、mplayerのvo_nokia770.c(-vo omapfb)からコードを失敬していじっていると、ひとたび再生すればもれなく再起動まで画面をぶっ壊すおののき系最恐バイナリが出来てしまい、あえなくお蔵入りとなりました。


さてと、随分と長くなりました(約500わたし彼女)。よってmplayerとlibcaca編は後半へつづく

4 件のコメント:

  1. >mplayerだと間延びしたように音声の再生がおくれる
    つ mplayer -framedrop

    返信削除
  2. armelのビルド(dpkg-buildpackage)には
    export DEB_BUILD_OPTIONS="maemo-launcher,thumb,vfp,parallel=4"
    って環境変数セットしろって、どっかに書かれてありましたね。

    とくにvfpの影響は大きく、Qtのベンチとってたときmaemo auto builderでビルドすると1割増しで速くなるので、なんでかなーって思ってたことがありました。

    それと自分も以前gst-ffmpeg(0.10.6使ったらしい)をビルドしたんですが、いまいちな結果に...0.10.2くらいなら大丈夫なんですね。また機会があったら試してみよーっと。

    返信削除
  3. >匿名さん
    コメントどうもです。
    N810のmplayerでは、なぜだか-noframedropのが随分マシだったりします。
    -hardframedropでは描画が止まったりするし、うまくframedrop出来てないようです。

    >kimitakeさん
    参考になります(いろいろ読まなきゃな)。そういえばautobuilderのログにそんなの出てました。

    自分も0.10.10~7と連敗、0.10.6にmplay
    erのlibavcodec周りをコピーしてなんとかmakeに成功したんですが、0.10.2で再生できるファイルが出来なかったりと微妙なモノができあがってしましました。

    自動判別ってのはgst-plugins-baseあたりを新しくすれば良くなるんですかね?

    返信削除
  4. 自動判別ですが、gst-plugins-baseだった気がしますが定かでないです^^;

    ちなみにほんのちょっとですが、以前やった作業ログを貼っときます。あまり参考にはならないと思いますが^^;
    http://wiki.kimitakeblog.net/doku.php/dev/maemo/gstreamer

    返信削除