PS3用に uShare DLNA サーバーをインストール&MP4対応改造

ご存知の方は多いと思いますが、 PS3DLNAクライアントの機能があり、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動画を再生開始するときに数秒間固まります。まぁ、それさえ気にしなければあまり問題はなさそうですね。