ページ

2012年7月11日水曜日

MediatombをビエラのDLNAサーバとして使う(その8)

(前回)

MediatombをビエラのDLNAサーバとして使った場合、直接ファイルを再生する(バイト・レンジ・シークを使う)と早送りや一時停止で映像に復帰できない(ビエラ側の)バグがあることは前回に説明しました。

そこで、Mediatomb側にパッチを当てることでタイム・ベース・シークを可能にし、Mediatomb側からはトランスコードで映像を送信することで対応できることがわかりました。私は既に対応して半年以上ですが快適に使用できています。

まず、ここから Add time-based seek capability to transcoded streams というパッチをダウンロードしてMediatombに適用します。

次に、トランスコードの設定ですが、いろいろ細かいのと各自のやり方があるので方法は任せます。
ただし、標準の引数 %in %out の2つに加えて %seconds が追加されるので、%seconds を受け取って、ffmpeg の -ss オプションに渡せるようにします。

私は、トランスコードについては全てシェルを作って対応していますが、イメージとしては以下のようになるようにします。

ffmpeg -ss %seconds -i %in -vcodec copy -acodec copy -f mpegts -y %out

上記のキモは -ss オプションの位置です。-i オプションの後ろで指定すると、映像の先頭からデコードしながら開始位置を探すので、指定された秒数に比例して再生されるまでの時間が掛かってしまいます。-i オプションの前で指定すると一瞬で指定された秒数に飛ぶことができます。
※上記の設定が判るまでmencoderを使用したりしたが、音ズレと再生位置のズレがヒドくて使い物になりませんでした。

この方法を使うと映像と音声をコピーしているだけなのでCPUへの負荷はまったくありません。また、ビエラ側で経過時間が表示され、30秒スキップも使用できるので非常に便利になります。H.264にエンコードされたファイルでも使用可能です。

ただし、一点だけ注意点があります。PT2で録画した映像に関しては、ファイルの先頭部分がffmpeg にとっては不正な場合が多々あります。このような映像の場合、上記のように -i オプションの前に -ss オプションを指定すると ffmpeg がエラー終了してしまいます。-i オプションの後ろに指定した場合は問題ありません。

そこで、私は、PT2で録画した映像に関しては録画が完了すると -ss オプションで映像の先頭1秒をカットしたファイルを(-vcodec copy -acodec copyで)再作成するようにしています。そうすることで、上記のシェルでも問題なくトランスコードができるようになります。
また、録画を開始してから数秒遅れで1秒カットの映像を -re オプションで別ファイルに作成して、そのファイルを再生するとタイムシフト再生(一時停止やスキップ)も可能になります。


実際には、録画が完了した時点で、主に以下のことを行うシェルを実行させて映像の再作成を行っています。

1. Programが複数あれば、tssplitter_liteで先頭のprogramidだけを抽出する。抽出した後、以下のことを行う。

2. 先頭の60秒だけ音声の変更チェック(5.1chなど)を行い、音声の変更があったところから変換を開始する。(これは、PCからVLCで再生できるようにする為)

3. 先頭の10秒だけ二ヶ国語放送(ステレオの左と右で音声が違うバージョン)のチェックを行い、二ヶ国語放送の場合は、左と右の音声を分離してから再合成する。(これも、PCからVLCやXBMCで音声が出るようにする為)

4. 音声が複数ある場合は、-newaudio オプションで音声を追加する。

細かいところでは、EPGrecのサムネイルを再作成したり、他にもいろいろやっていますが、映像を再作成することで、いろんなデバイスから再生できるようにしています。

次回は、トランスコードを使用しててもビエラ側で映像のサムネイル表示ができるようにします。

(追記 2012年7月23日)
config.xmlのサンプルを(ここ)に置いておきます。
※ビエラは、mimetypeが「video/mpeg」でも「video/vnd.dlna.mpeg-tts」のどちらでもビデオファイルと認識して再生しようとします。
※再生に関しては、/usr/local/bin/mediatomb-mpeg2copy.shと/usr/local/bin/mediatomb-mpeg4copy.shの2つのシェルを作って、内部でffmpegでトランスコードしています。今は、2つの中身は同じですが、以前は、mpeg4copy.shのみlibx264でエンコードしたファイルをmpeg2に戻して再生していました。今は、両方ともコピー再生しています。mediatomb-mpeg2copy.shのサンプルも置いておきます。(一部省略していますが、使用可能と思います)

(つづく)

5 件のコメント:

  1. パパラクダさん、はじめまして。
    まさと申します。

    うちでも2年半ほど前にTH-P50V1を購入して、
    PT2と組み合わせて快適PCレコーダー生活を送ろう!
    と頑張ってみたのですが、既に記事にされているような、
    早送りの途中で再生が終わる、30秒スキップができない、
    など実用は無理だなと言う結論に達し、REGZAにしておけば
    良かったという思いを押し殺し、あきらめていました。
    ところが、最近になってパパラクダさんの記事を見つけ、
    おおおお〜っ!と思い、記事を参考に色々ためさせて頂きました。

    ようやく、mediatombにタイムベースシークのパッチをあて、
    ffmpegの設定も行い、いよいよ!と思ったのですが、
    うまくいかないのです。

    具体的には、config.xmlのマッピングのところで、
    map from="ts" to="video/mpeg"として、
    トランスコードのマッピングのところに、
    transcode mimetype="video/mpeg" using="tstrans"としました。
    こうすると、Vieraが自分で再生できるフォーマットだと思うのか、
    トランスコードされず、生のままmediatombから送り出されているようです。
    なので、Vieraが認識できないmimetypeをマッピングに設定すると、
    Vieraが認識できず一覧にも表示されない、、、
    何か根本的に間違っているような気もするのですが、アドバイスを頂けたらと。
    ちなみに、mimetypeをvideo/unknowとして、WMP、WMCで試してみると、
    ちゃんとトランスコードされる(mediatombのログに残る)ので、
    Vieraのせい?と思っているのですが、、、

    長文失礼しました。

    返信削除
    返信
    1. まささん、はじめまして。ブログを見ていただきありがとうございます。

      コメントを拝見したところ、まささんのお察しの通り、ビエラ側が自分で再生できると認識していると思われます。

      map from="ts" to="video/mpeg"の所で、ビエラ側には「video/mpeg:DLNA.ORG_OP=01」という情報が送られていると思います。
      で、トランスコードの設定も働いていて「video/????:DLNA.ORG_OP=10」の情報も送られているはずです。(????は、tstransの設定内で指定されているmimetype)
      ただ、ビエラは「ORG_OP=01」を優先するので「ORG_OP=01」が自分で再生可能と判断すれば、そちらを再生します。(ORG_OP=01はオリジナルリソース)

      そこで、考えられる対応方法は2通りあります。

      1)map fromの所にビエラで認識できないmimetypeを設定
      まず、map from="ts" to="video/mpeg2ts"など設定し、
      次に、transcode mimetype="video/mpeg2ts" using="tstrans"とします、
      最後に、profile name="tstrans" enabled="yes" type="external"の中でmimetypeをvideo/mpegとする。

      2)profile name="tstrans"の中で「ORG_OP=01」の情報を送らないように設定
      profile name="tstrans"の中に以下のタグを追加します。
      <hide-original-resource>yes</hide-original-resource>
      上記を設定するとトランスコードの情報のみ送られるはずです。

      ブログの最後に私が使用しているconfig.xmlをサンプルとして追加しておきます。(個人情報は???に変更済)

      私の場合、拡張子.tsはそのまま再生し、拡張子.m2tsをトランスコードする設定にしています。

      削除
    2. パパラクダさん

      おはようございます。まさです。

      早速のコメントありがとうございます。
      教えていただいた方法を試してみました。
      1)は、ビエラが画像?と判断してしまうようで、
      画像のスライドショーになってしまいました。
      2)これ!!このタグなんですね!!
      このタグを設定すると、ビエラからトランスコードの要求が来たようで、
      ffmpegが動いた形跡がありました!
      ただ、トランスコードの設定がうまくいってないようで、
      再生できなかったのですが、大きな進歩です。
      ありがとうございます!!

      2年ほど前に試した時に、うちのビエラ(V1)では生TSが再生できないので、
      色々な変換をかけて試してみたのですが、
      うちのビエラはMPEG-TSだと192バイトパケットでないと
      再生してくれないようです。
      なので、ffmpegに -packetsizeオプションをつけてみたのですが、
      今のところうまく行きませんでした。

      でも、後はffmpegのオプションをいじくり倒すか、
      パパラクダさんがされているように、録画後に変換しておくか、
      どちらか良いほうを選択したいと思います。
      また、サンプルの設定ファイルもアップしていただきありがとうございます。
      参考にさせていただきます。

      しかし、ビエラには困ったものですね。
      ORG_OP=01を優先するわりに、変数を桁あふれさせるって、、、

      もう少し色々試してみて、結果報告させていただきますね。

      ありがとうございました。

      削除
    3. まささん、こんばんわです。

      うまくいかれたとのことでホッとしております。よかったです^^

      1)の方法でスライドショーになってしまう原因は判りませんが、わが家でも以前はサムネイル表示の設定をしているとスライドショーになっていました。
      でも、2)でトランスコードが働いているとのことなので、サムネイル表示の設定はされていないと思います。

      ところで、わが家のビエラはTH-P46V2なのですが、V1には192バイトパケットの問題があるとは知りませんでした。ffmpegに-packetsizeオプションがあることも。いろいろ勉強になります^^

      ビエラ特有の不具合には、お互い泣かされていますね><

      ffmpegでの再生がうまく行くといいですね!!がんばってください^^

      こちらこそ、少しでもお力になれたことを嬉しく思っております。

      削除
    4. パパラクダさん

      こんばんわ。まさです。

      ご無沙汰しています。
      結論から言うとまだうまくいってないのですが、ちょっと近況報告をさせていただきます。

      前の書き込みで、V1は192バイトパケットしか再生してくれないと書きましたが、これをffmpegから出力させるのにかなり苦労しました(^^ゞ
      当方CentOS6.2なのですが、rpmforgeから入れたバージョンのffmpeg(確か0.6.xくらい)では192バイトパケットの出力ができませんでした。なので、色々調べたところ、新しいバージョンにして、出力ファイル名の拡張子をm2tsにしたときのみ、192バイトで出力されることがわかりました。この時点では、ふーん、じゃぁ新しいやつをソースから入れるか。めんどくさいなぁという程度にしか思わず、ちくちくとソースからインストールして、無事に192バイトパケットが出力されることを確認し、これでできた!
      と思ったのですが、ここで(・・???
      トランスコードするときに、出力ファイル名ってないじゃん(~_~;)
      あああぁぁぁ、、、
      ということで、どうするか悩んだ挙句、ソースをいじって、フォーマットがmpegtsだったら常に192バイトにするようにしてしまいました。ようやくここまでやって、トランスコードした生tsがVieraで表示できました!!!

      んで、後は、30秒スキップができればOKと思ったら、今度はVieraの時間表示は30秒ずつ増えていっているのに、映像はスキップボタンを押すたびに最初から再生されてしまいます、、、
      う~む、、、

      と、またまたかなり長文になりましたが、こんなところで躓いています。何か思い当たる節があったら教えていただけたらと思ったのと、近況報告ということで、書き込みさせていただきました。

      どうも長文失礼しましたm(__)m

      削除