PS3用に uShare DLNA サーバーをインストール&MP4対応改造
ご存知の方は多いと思いますが、 PS3はDLNAクライアントの機能があり、DLNAサーバーの機能を持ったHDDレコーダーやNASなどに置いてあるメディアファイルを再生することが出来ます。
我が家の場合、NASも兼ねた家庭内Linuxサーバーがいますので、そこにDLNAサーバーソフトをセットアップすれば、この機能を使えるわけです。PS3に対応したDLNAサーバーはいくつかあります。有名なところでは最初にPS3に正式対応した MediaTomb でしょう。
しかし、今回はそれとは別の uShare というソフトをインストールしてみました。もともと Xbox のダッシュボード用に開発されたソフトですが、最近のバージョンはきちんとDLNA対応しているうえ、重量級のMediaTomb に比べて設定が簡便で軽快に動作するので、試しに使ってみたというわけです。まぁ、 rpmforge にパッケージがあったから、というのも理由としては大きいんですが。
そういうわけで、簡単だと踏んで手を出したわけですが、意外と引っかかったのでメモしておきます。
rpmforge からインストール
いつものとおり、yum で rpmforge からインストールします。
# yum --enablerepo=rpmforge install ushare
きちんとサーバーの起動スクリプトなども整備されていますので、設定を調整したらそのスクリプトを起動させればOKです。
$ rpm -ql ushare | grep etc /etc/rc.d/init.d/ushare /etc/ushare.conf # vi /etc/ushare.conf # /sbin/service ushare start Starting UPnP Media Server (ushare): [ OK ]
/etc/ushare.conf では、最低限 USHARE_DIR で共有するディレクトリを指定することと、PS3用に ENABLE_DLNA=yes とする必要があるはずです。
起動ログは /var/log/messages に uShare の名前で記録されますので、きちんと動作しているかどうかはこれをみればわかります。
ただし、私が試したバージョンでは
Interface eth0 is down. Recheck uShare's configuration and try again !
などといった嘘のエラーメッセージが出ることがあるので注意が必要です。
また、デーモンプロセスは ushare という名前の専用ユーザーで動作するので、そのユーザーがアクセスできるアクセス権にしておく必要があります。 ushare を自分と同じグループに属させてグループ読み込み権限をつけるか、otherの読み込み権限をつけてしまうのが楽でしょう。
$ chmod -R go+r /path/to/videodir
mp4 videoを再生可能にする
さて、軽く使う分にはこれで十分実用的なんですが、1点不満がありました。
拡張子”mp4”のファイルが、なぜかオーディオファイルとして扱われてしまっているようなのです。PSP用に作成した動画やネットに置かれている動画がmp4なので地味に不便です。
それでは、拡張子と挙動の対応を変更するにはどうすればいいか……と、オフィシャルサイト を見たところ、「ソースコードの src/mime.c を編集しろ」との豪快な回答が。
しかたないので、結局ソースから手を入れることにしました。
# yum --enablerepo=rpmforge install mercurial $ hg clone http://hg.geexbox.org/ushare
とはいえ、コンパイルに必要なライブラリは rpmforge に揃っている(rpmforge に uShare のパッケージがあったので当然っちゃ当然なんですが)ので、ありがたく使わせてもらいます。ソースからコンパイルする場合、ライブラリの準備の方が普通は面倒なので、これは助かります。
$ sudo yum --enablerepo rpmforge install mercurial libdlna-devel libupnp-devel ffmpeg-devel
で、 ソースをconfigure
$ cd ushare $ ./configure --enable-dlna Checking for compiler available... Checking for locales ... Checking for ifaddrs ... Checking for langinfo ... Checking for iconv ... Checking for libdlna >= 0.3.0 ... Error, libdlna < 0.3.0 ! See file "config.log" produced by configure for more details.
おや?
$ cat /usr/lib/pkgconfig/libdlna.pc prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: libdlna Description: DLNA (Digital Living Network Alliance) library Version: 0.2.3 Requires: libavformat libavcodec Conflicts: Libs: -L${libdir} -ldlna -lavformat -lavcodec Cflags: -I${includedir}
バージョン足りないやん。 orz
しかたないので、rpmforge で入れたバージョンを確認し、
$ rpm -q ushare ushare-1.1a-3.el5.rf
そのバージョンまで巻き戻す。
$ hg tags tip 450:cd5340ee2437 uShare_v1.1a 414:1195a6789c62 uShare_v1.1 400:d715f5dc245c uShare_v1.0(real) 315:1a7c218fd933 uShare_v1.0 313:ed30c1fd7d29 uShare_v0.9.10 300:1e1eb80fd6d6 uShare_v0.9.9 296:72776c98930a uShare_v0.9.8 240:a8d00f655587 $ hg update uShare_v1.1a 41 files updated, 0 files merged, 3 files removed, 0 files unresolved
せっかくソースを持ってきたので、できれば最新版でやりたかったんですけどね。
参考までに、使っている版と最新版の mime 対応状況を比較してみる。
$ hg diff -r tip src/mime.c diff -r cd5340ee2437 src/mime.c --- a/src/mime.c Tue Jan 05 12:07:50 2010 +0100 +++ b/src/mime.c Sun Feb 14 09:12:56 2010 +0900 @@ -21,7 +21,6 @@ #include <stdlib.h> #include <string.h> -#include <stdio.h> #include "mime.h" #include "ushare.h" @@ -54,7 +53,6 @@ { "mpeg2", UPNP_VIDEO, "http-get:*:video/mpeg2:"}, { "m4v", UPNP_VIDEO, "http-get:*:video/mp4:"}, { "m4p", UPNP_VIDEO, "http-get:*:video/mp4:"}, - { "mp4", UPNP_VIDEO, "http-get:*:video/mp4:"}, { "mp4ps", UPNP_VIDEO, "http-get:*:video/x-nerodigital-ps:"}, { "ts", UPNP_VIDEO, "http-get:*:video/mpeg2:"}, { "ogm", UPNP_VIDEO, "http-get:*:video/mpeg:"}, @@ -81,6 +79,7 @@ { "mp1", UPNP_AUDIO, "http-get:*:audio/mp1:"}, { "mp2", UPNP_AUDIO, "http-get:*:audio/mp2:"}, { "mp3", UPNP_AUDIO, "http-get:*:audio/mpeg:"}, + { "mp4", UPNP_AUDIO, "http-get:*:audio/mp4:"}, { "m4a", UPNP_AUDIO, "http-get:*:audio/mp4:"}, { "ogg", UPNP_AUDIO, "http-get:*:audio/x-ogg:"}, { "wav", UPNP_AUDIO, "http-get:*:audio/wav:"},
まさにコレじゃねぇか。くそぅ。 orz
該当修正の情報を hg を使いピンポイントで抜き出して、
$ hg annotate -r tip src/mime.c | grep mp4 331: { "m4v", UPNP_VIDEO, "http-get:*:video/mp4:"}, 331: { "m4p", UPNP_VIDEO, "http-get:*:video/mp4:"}, 416: { "mp4", UPNP_VIDEO, "http-get:*:video/mp4:"}, 331: { "mp4ps", UPNP_VIDEO, "http-get:*:video/x-nerodigital-ps:"}, 331: { "m4a", UPNP_AUDIO, "http-get:*:audio/mp4:"}, $ hg log -p -r 416 changeset: 416:15a916aac837 user: Benjamin Zores <ben@geexbox.org> date: Mon Dec 10 21:11:30 2007 +0100 summary: mp4 extension is much more used with videos and than audio files diff -r eb339c4230cc -r 15a916aac837 src/mime.c --- a/src/mime.c Sun Dec 09 14:05:26 2007 +0100 +++ b/src/mime.c Mon Dec 10 21:11:30 2007 +0100 @@ -53,6 +53,7 @@ { "mpeg2", UPNP_VIDEO, "http-get:*:video/mpeg2:"}, { "m4v", UPNP_VIDEO, "http-get:*:video/mp4:"}, { "m4p", UPNP_VIDEO, "http-get:*:video/mp4:"}, + { "mp4", UPNP_VIDEO, "http-get:*:video/mp4:"}, { "mp4ps", UPNP_VIDEO, "http-get:*:video/x-nerodigital-ps:"}, { "ts", UPNP_VIDEO, "http-get:*:video/mpeg2:"}, { "ogm", UPNP_VIDEO, "http-get:*:video/mpeg:"}, @@ -79,7 +80,6 @@ { "mp1", UPNP_AUDIO, "http-get:*:audio/mp1:"}, { "mp2", UPNP_AUDIO, "http-get:*:audio/mp2:"}, { "mp3", UPNP_AUDIO, "http-get:*:audio/mpeg:"}, - { "mp4", UPNP_AUDIO, "http-get:*:audio/mp4:"}, { "m4a", UPNP_AUDIO, "http-get:*:audio/mp4:"}, { "ogg", UPNP_AUDIO, "http-get:*:audio/x-ogg:"}, { "wav", UPNP_AUDIO, "http-get:*:audio/wav:"},
(うっ。書いてたらなんか、mercurial講座みたくなってきたw)
該当修正をパッチ当てして、
$ hg log -p -r 416 | patch -p1 patching file src/mime.c
ついでに、設定中にハマった嘘エラーメッセージの修正も取り込んで、
$ hg log -p -r 73e3b3069a1a changeset: 417:73e3b3069a1a user: Benjamin Zores <ben@geexbox.org> date: Mon Dec 10 21:11:45 2007 +0100 summary: displaying error messages in case of success is stupid diff -r 15a916aac837 -r 73e3b3069a1a src/ushare.c --- a/src/ushare.c Mon Dec 10 21:11:30 2007 +0100 +++ b/src/ushare.c Mon Dec 10 21:11:45 2007 +0100 @@ -424,8 +424,6 @@ if ((itf->ifa_flags & IFF_UP) && !strncmp (itf->ifa_name, interface, IFNAMSIZ)) { - log_error (_("Interface %s is down.\n"), interface); - log_error (_("Recheck uShare's configuration and try again !\n")); freeifaddrs (itflist); return true; } $ hg log -p -r 73e3b3069a1a | patch -p1 patching file src/ushare.c
ビルドします。
$ ./configure --enable-dlna && make && echo DONE (中略) DONE
OK。
本来なら、手ビルドしたアプリは /usr/local/ にインストールすべきですが、設定ファイルなどが面倒くさいので、今回は、RPMでインストールしたファイルはそのままに、ビルドしたバイナリだけ置き換えることにします。良い子は真似しないように。
$ ./configure --enable-dlna --prefix=/usr --sysconfdir=/etc && make # su # /sbin/service ushare stop # mv /usr/bin/ushare{,.v1.1a_rpmforge} # mv src/ushare /usr/bin/ # /sbin/service ushare start
軽くテストしてみて、問題がなければ、自動起動までONにします。
# /sbin/chkconfig ushare on
これでOK。
拡張子がmp4の動画も正常に再生できるようになりました。
で、使ってみた感想ですが、これは多分PS3側の問題だとおもうのですが、MP4動画を再生開始するときに数秒間固まります。まぁ、それさえ気にしなければあまり問題はなさそうですね。