2013年11月29日金曜日

mediatomb + Viera で TED video を再生

前回のBlog で、 mediatomb + Viera で TED video (High Resolution) を再生すると
画面右1割ぐらいが引っ張られたようになる、という話をしましたが、
試行錯誤で何とかみられるようになりました。

結局、 前回記載した Viera の再生サポートページを参考に
トランスコードで再生する場合は  MPEG-2 TS もしくは MPEG-2 PS のどちらかでないといけないので
MPEG-2 TS, PS に対応するフォーマットをすべて試してみた。

ffmpeg  -formats  で確認したところ


●MPEG-2 TS
  •  mpegts : 再生可能(ただし画面ずれ有)
  •  mpegtsraw : 再生不可
●MPEG-2 PS
  •  dvd : 再生可能(画面ずれ有)
  •  svcd : 再生可能(画面ずれ有)
  •  vob : 再生可能(画面ずれ有)
元の動画が  MP4 ( h.264 / AAC ) なので、 
ffmpeg が余計な変換をしなくていいように、という観点で
結局 MPEG-2 TS ( h.264 / AAC ) しかないか、、、という結論に達しました。

でも画面ずれがあるし、、、と思いながらログを眺めていると
なんとエラーメッセージが出ていました

[mpegts @ 0x873d060] H.264 bitstream malformed, no startcode found, use the h264_mp4toannexb bitstream filter (-bsf h264_mp4toannexb)
ということで、 意味は分かりませんが、 -bsf h264_mp4toannexb を指定したところ
無事に解決!

TED + 英語字幕で勉強です。 テレビで見られるのがよい。
ダウンロードするのが面倒ですが。。。

Viera で再生可能なフォーマット / MP4 format requires a seekable stream

備忘がてら。

Viera TH-L37R3 で DMR として再生できるフォーマットについては

Panasonic のサポートページに記載されていました。

TH-P50/46/42VT3・TH-P50/46/42GT3・TH-P46/42ST3・TH-L37/32DT3(DMR機能で再生できるコンテンツの種類)
http://panasonic.jp/support/tv/connect/dmr/th_vt3_gt3_st3_dt3.html
細かな型番は違いますが。。。

TED でダウンロードした MP4 ( h.264 / AAC ) をそのまま再生できるのですが
High Resolution の場合、スムーズに再生できない状況です。

試しに、 わざわざトランスコード (MPEGTS (mpeg2video /mp2) してみたところ、スムーズに再生できた。。。
ただ、なぜか TED のMP4 をトランスコードして再生すると、画面の右1割程度が
引っ張られたようにぶれた感じになってしまいます。。
直し方は要調査。

それでは、ということで  さらに試しに、MP4 (h.264 / AAC) にトランスコードしてみた
(なにも変わっていませんが、試しに。です)
すると、下記のようなエラーが発生。

 [mp4 @ 0x996b8a0] muxer does not support non seekable output
Could not write header for output file #0 (incorrect codec parameters ?): Operation not permitted

調べてみると、どうも MP4 というフォーマットは seekable でないといけないらしい
ffmpeg でのトランスコードで mediatomb のパイプに連携する場合
受信側から見ると seekable に見えないようですね。。。

以下引用
--------------------------------
you cannot write to a pipe using MP4 format,
as the MP4 format requires a seekable stream - it is logically impossible.
--------------------------------

こうなると High Resolution 版はあきらめるか、
MPEG-TS で画面表示がおかしい原因を突き止めるか、、、 多難です。

※2013/12/01 補足 ----------------------
ffmpeg で作成した mp4 コンテナには、メタデータを格納した Moov atom という部分が
一番後ろにあるそうです。
-movflags faststart オプションをつければ、 2パス目のエンコードの際に
該当の Moov atom 部分を先頭に持ってくることができ、ストリーミング可能になる模様。
ただし、トランスコードでは、2パスエンコーディングではないためダメなんでしょうね。。。

movflags については下記を参照(movflags で検索)
http://ffmpeg.org/ffmpeg-formats.html

なお、手持ちの ffmpeg が movflags faststart に対応しているかどうかは
ffmpeg -h full でヘルプを表示させ、 movflags を探せばよいです。
full がついていないと表示されません。。。
------------------------------------------

※ 2013/12/10 追記 -----------------------
Viera catalog
http://ctlg.panasonic.com/jp/tv-theater/viera/lcd-tv/TH-L37R3.html
-----------------------------------------

2013年11月21日木曜日

mediatomb コンパイル

Fedora 19 環境で mediatomb をコンパイルした時のメモ

●入手元
入手元も後から再確認したため、実際とは違うかも。

mediatomb-0.12.1
http://mediatomb.cc/pages/download

mediatomb-seek.patch
http://sourceforge.net/p/mediatomb/patches/19/

mediatomb-0.12.1-gcc46.patch
http://sourceforge.net/p/mediatomb/patches/25/

mediatomb-0.12.1.tonewjs.patch
mediatomb-0.12.1.jsparse.patch
http://sourceforge.net/p/mediatomb/patches/31/


libav_0.7_support.patch
https://launchpadlibrarian.net/71985647/libav_0.7_support.patch

libavformat_0.11_support.patch
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=677959

timeseek.patch (ファイル名は適当)
http://www.ongs.net/ossan/diary/?date=20110923


●追加導入
mediatomb のWebページの Requirement の S/W と devel パッケージ
後から確認しているため、一部間違っているかも。。。
すべて yum で導入

・sqlite
sqlite-devel-3.8.0.2-4.fc19.i686
sqlite-3.8.0.2-4.fc19.i686

・MariaDB
mariadb-libs-5.5.33a-1.fc19.i686
mariadb-5.5.33a-1.fc19.i686
mariadb-devel-5.5.33a-1.fc19.i686
mariadb-server-5.5.33a-1.fc19.i686

・expat
expat-devel-2.1.0-5.fc19.i686
expat-2.1.0-5.fc19.i686

・zlib
zlib-devel-1.2.7-10.fc19.i686
zlib-1.2.7-10.fc19.i686

・file  ( libmagic )
file-devel-5.11-11.fc19.i686
file-libs-5.11-11.fc19.i686
file-5.11-11.fc19.i686


・js
js-devel-1.8.5-13.fc19.i686
js-1.8.5-13.fc19.i686

・taglib
taglib-devel-1.9.1-1.fc19.i686
taglib-1.9.1-1.fc19.i686

・libexif
libexif-0.6.21-4.fc19.i686
libexif-devel-0.6.21-4.fc19.i686

・curl
curl-7.29.0-12.fc19.i686
libcurl-devel-7.29.0-12.fc19.i686
libcurl-7.29.0-12.fc19.i686

・ffmpeg 関連
ffmpeg-libs-1.2.4-2.fc19.i686
ffmpeg-devel-1.2.4-2.fc19.i686
ffmpegthumbnailer-2.0.8-4.fc19.i686
ffmpeg-compat-0.6.7-1.fc19.i686
ffmpeg-1.2.4-2.fc19.i686
ffmpegthumbnailer-devel-2.0.8-4.fc19.i686
ffmpeg-compat-devel-0.6.7-1.fc19.i686

・lastfmlib
lastfmlib-0.4.0-7.fc19.i686
lastfmlib-devel-0.4.0-7.fc19.i686

●パッチ適用
各 patch ファイルは、 mediatombのソースを展開してできる mediatomb-0.12.1 ディレクトリと
同じレベルに配置して下記のスクリプトを実行。

libavformat については 0.7 -> 0.11 の順で適用
最後の time-seek.patch の 3つの HUNK のうち、
真ん中の1つ ( static int _parse_npt 関数 ) は
なぜか適用失敗。 
原因がわからなかったので、転記して組み込み(笑)

echo
echo "patch : mediatomb-seek.patch"
patch -p0 < ../mediatomb-seek.patch

echo
echo "patch : mediatomb-0.12.1-gcc46.patch"
patch -p1 < ../mediatomb-0.12.1-gcc46.patch

echo
echo "patch : mediatomb-0.12.1.tonewjs.patch"
patch -p1 < ../mediatomb-0.12.1.tonewjs.patch

echo
echo "patch : mediatomb-0.12.1.jsparse.patch"
patch -p1 < ../mediatomb-0.12.1.jsparse.patch

echo
echo "patch :libav_0.7_support.patch"
patch -p1 < ../libav_0.7_support.patch

echo
echo "patch : libavformat_0.11_support.patch"
patch -p1 < ../libavformat_0.11_support.patch

# timeseek.patch は一部適用失敗するが、その部分のソースを追記すればよい
echo
echo "patch : timeseek.patch"
patch -p0 < ../timeseek.patch

●ビルド
mediatomb-0.12.1 ディレクトリに移動し下記のコマンドを実施

./configure
make -j2

なお、 mediatomb の Documentation には、 チェックアウトしたソースを使う場合には
autoreconf -i をする、という記載もあったが、今回はダウンロード版なので実施しない。
(実施するとコンパイルが通らなかった)

たまたま 2並列実行可能な PC だったため、  make に -j2 オプションを指定

いくつか警告 ( search の代わりに this->search を使う、など)がでたが
無事コンパイル成功

●インストール
通常であれば make install するところだが、
今回は初回に yum で導入しているため、それを手動差し替え

mv /bin/mediatomb /bin/mediatomb.org
cp mediatomb-0.12.1/build/mediatomb /bin/mediatomb.YYYYmmdd
ln -s /bin/mediatomb.YYYYmmdd /bin/mediatomb

●起動
systemctl start mediatomb.service

/var/log/mediatomb のログを確認し、エラー等がないことを確認



まとめるとこんなもんだけど、ずいぶん時間がかかった。。。
何回コンパイルしたかもう忘れた~

パッチを作成してくださった皆様と、
各種情報をネット上に公開してくださっている皆様に感謝です!




2013年11月20日水曜日

mediatomb 設定(忘れないうちに)

さて、 mediatomb 関連の設定について、忘れないうちに。

●Firewall

Fedoraのいつからかは知りませんが、 iptables から firewalld にかわった模様です。
個人的には、慣れた(?) iptables の方がわかりやすいですが
それこそ慣れの問題だろうということで。

該当の Fedora19 はホームネットワーク上にあり、公開もしていませんが
なぜか firewalld 上は DMZ ゾーンに設定しています。

該当 zone に設定している mediatomb 関連のポートは以下の3点
50500/tcp ,  50500/udp,   1900/udp

50500 は mediatomb で使用 (udp はいるかいらないかわかりませんがとりあえず設定)
1900 は UPnP です。

● config.xml
mediatomb のメイン設定。 基本的なところは検索すればすぐに出てくるので
主なところ、躓いたところだけ。
。。とは言いつつも、テスト的に入れた設定があれこれ混ざっていて整理されていませんが…

・Protocol Info
<protocolInfo extend="yes"/>

PS3 向け設定、という感じで config.xml にも mediatomb の Documentation にも記載されています。
ただし、これを yes に変更しないと viera のリモコンでの 早送り、30秒スキップ、一時停止操作などを行った際に”操作はできません”というような内容のメッセージがテレビに表示されてしまいました。

・ MIMEタイプマッピング
<map from="avi" to="video/divx"/>
たまたま手持ちの動画の形式が  ファイル:avi ,  映像:DivX,  音声:mp3 だったので
この設定を追加(というかコメントを外して有効化)
他にもネット情報に基づきいろいろ追記。

・トランスコード設定
<transcode mimetype="video/divx" using="ffmpeg-viera"/>

video/divx の MIME タイプが来たら ffmpeg-viera という Profile を使用する設定

・プロファイル設定
      <profile name="ffmpeg-viera" enabled="yes" type="external">
        <mimetype>video/vnd.dlna.mpeg-tts</mimetype>
        <accept-url>no</accept-url>
        <first-resource>yes</first-resource>
        <hide-original-resource>yes</hide-original-resource>
        <agent command="/xxx/bin/ffmpeg-viera" arguments="%in %out %seconds" can-seek="yes"/>
        <buffer size="14400000" chunk-size="512000" fill-size="1024000"/>
      </profile>

mimetype は Viera で受け付けるという(どなたかのページで見た)情報をもとに
vnd.dlna.mpeg-tts を指定。  video/mpeg でも動いた記憶あり。
ここで、 DLNAの Profile ID など (DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=10;DLNA.ORG_CI=1 など) を指定するという情報もあったものの
それを追加すると 「再生できないフォーマットです」 の病気にかかるため
結局記載せず。 
DLNA.ORG_* については少し調べたものの結局全く分からず…

agent については、 ffmpeg-viera というスクリプトを指定。
引数には %in, %out 以外に、 タイムシーク用の  %seconds と can-seek="yes" を追加

buffer については、サンプル等を見ながら指定。 fill-size と chunk-size の大小関係が
これでよいのかよくわからないがとりあえず。。

first-resource や  hide-original-resource も、細かくはいろいろありそうですが
ネット上のほかの人ほど詳しくもないのでとりあえず yes 指定。

●トランスコーディングスクリプト
トランスコードのスクリプト自体は省略。 これもこの先細かく調整していこうと思っています。
コアな部分だけ。

exec "/bin/ffmpeg"
   -threads 2
   -ss "プロファイルの%seconds"
   -i "プロファイルの%in"
   -vcodec mpeg2video
   -b:v 4096k
   -aspect 16:9
   -acodec mp2
   -b:a 192k
   -ac 2
   -f mpegts
   - > "プロファイルの%out" 2>>${LOGFILE}

※改行しています。
オプションは ffmpeg のマニュアル等を参照。 (結構変わるらしい)
ポイントとしては以下のとおり
・ exec で実行 (終了時に mediatomb から kill できるように)
・ -ss は -i の前 (シーク時にデコードしながらシークしないように)
・ -f で指定するフォーマットはトランスコードプロファイルで指定した mimetype と形式が一致するように

その他
・ -thread 2 : たまたま 2 thread 実行できる環境なので
・ 2>>${LOGFILE} : ログは取得する派です。そこそこ出るので消すのもお忘れなく。
・ 当然実行権限要 (1度ぐらいは必ず忘れる)

ここまで来るのにもネット上の色々な方のページを参考にさせていただきました。
ありがとうございます。

次はようやくタイムシークのための再コンパイルについて。

2013年11月19日火曜日

Fedora19 + mediatomb 導入メモ (not 手順)

DLNA についてあれこれ調べていたのは
mediatomb + viera でトリックプレイをしたいから。

何とか出来たので備忘の意味を込めてメモ。。。

 ●環境
Fedora release 19 (Schrodinger’s Cat)
mediatomb-0.12.1-31.fc19.20120403gitb66dc1.i686

●導入メモ

・ Fedora 19 / RPM Fusion
Fedora19 のセットアップ自体はミニマムで実施。必要なファイルセットは yum で個別に導入する方針。

mediatomb 関連は fedora の yum リポジトリーには含まれていないため
rpmforge の yum リポジトリを追加します。

RPM Fusion のページから "Enable RPM Fusion on your system" をたどる
そこに、 Fedora 14 以降での 有効化方法が記載されているからそのとおり実施。

su -c 'yum localinstall --nogpgcheck http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm'

もちろん、 常時 root 作業なので(。。。) su -cなどはなし。

・MariaDB
mediatomb で使用するデータベースはデフォルトの sqlite3 よりも MySQL のほうがよいという
噂を聞きつけ、あらかじめ導入。
ただし、 Fedora19 では MySQL ではなく MariaDB に代わっている模様。
しばらく触っていないうちに浦島太郎状態。。。
yum で導入。 ただ、実際導入後は MySQL と同じ(笑)

・mediatomb
mediatomb も yum で導入。 そもそももともとメモする気もなかったためログなどはなし。
特に気にするところもなかった記憶があります。
最終的には mediatomb + viera でタイムシークを行うためソースからコンパイルしますが
ユーザーや設定回りは yum で入れると半自動のため、そちらを採用。
systemd での自動起動設定などはまだ勉強していないのでちょっとハードル高いし。。。
最終的に mediatomb のファイルのみを差し替える。
まぁ邪道といえば邪道かもしれませんが、動けばよし!とします。


・mediatomb の初期設定
初回起動して config.xml を作成する、など 一通りの設定を実施。
そのあたりは検索すればいろいろと出てきます。

ただ、ちょっと引っかかったのは、 systemd で自動起動設定をした後
Linux を再起動すると、 mediatomb の起動が失敗したこと。
mediatomb のログを見ていると、どうもネットワークが有効になる前に起動しようとした模様。

/lib/systemd/system/mediatomb.service ファイルを修正し、
ネットワークと、mediatomb で使用する MySQL  ( Fedora19 では MariaDB ) を起動した後に
mediatomb が起動するように変更
---
Requires=NetworkManager-wait-online.service network.target mysqld.service
After=NetworkManager-wait-online.service network.target mysqld.service
---
※注:後から systemd について少しかじったところ、ここを直接編集してはいけないらしい
/etc/systemd/system 以下(でしたっけ?)にファイルを置くと優先される模様。
例によって動けばよいポリシーで。


さて次は 設定と、トリックプレイの設定へ。
というか、初めからできていてほしい。。。












DLNA.ORG_PN

DLNA めも



DLNA.ORG_PN
メディアフォーマットを表すMedia Format Profile ID
コンテンツを伝送する時にサーバーとプレーヤーの間でMedia Format Profile IDを確認することで、互換性のあるコンテンツを選択することができる

形式
DLNA.ORG_PN=*<"a"-"z", "A"-"Z", "0"-"9", "_">

例)
DLNA.ORG_PN=MPEG_PS_NTSC

参考)
DLNAとは
http://www.sony.co.jp/SonyInfo/technology/technology/theme/dlna_01.html

DLNA.ORG_OP

DLNA 関連メモ

DLNA Networked Device Interoperability Guidelines March 2006,  7.3.32 MM op-param よりサマリー

DLNA.ORG_OP
コンテンツのランダムアクセス操作についてサポート内容を示すパラメーター
DLNA.ORG_OP=AB  (A,B はそれぞれ 0 or 1)

ABの意味
HTTP メディアトランスポートの場合
  • A : TimeSeekRange.dlna.org (タイムベースシーク)HTTPヘッダーのサポート
  • B : Range HTTPヘッダーのサポート
いずれも  1 がサポートあり
※Full Random Access Data Availability model の場合。 
 Limited Random Access Data Availability model の場合は異なる模様(未調査)

例)タイムベースシークの場合
DLNA.ORG_OP=10