2014年4月29日火曜日

DLNAサーバのmediatombを使って、REGZA 19RE2で手元の動画を片っ端から再生出来るようにしてみた

目的

  1. Debian wheezyに入れてある動画類(divx、mp4、AVC、tsなんかのごちゃ混ぜ)をDLNA使ってREGZAの19RE2で再生したい
  2. 画質は気にしない(19RE2がどうせフルHDじゃないので)
  3. めんどいので再エンコはしない。トランスコードする。
  4. トランスコードはffmpegを使う(使い慣れてるので)
  5. 早送り出来るように(WMP12経由だと出来るので)


DLNA serverとしてMediaTomb0.12.1を使用。
パッチを当てないとトランスコードしながらシークが出来ないらしいので、
まずdebianパッケージのmediatombのソースを取得してくる。
sudo vi /etc/apt/source.list
deb http://www.deb-multimedia.org wheezy main #追記
ソース取得。
sudo apt-get update 
sudo apt-get build-dep mediatomb
apt-get souce mediatomb 

ソースにシークパッチを当てる。
http://sourceforge.net/p/mediatomb/patches/19/
からmediatomb-seek.patchを落とし、ソースに当てる。


次、適当にmediatombをmakeしてcheckinstallする。

./configure 
make 
sudo checkinstall

次、config.xmlを書き換える。

  • 再生したい動画の拡張子を網羅
  • それを全部transcoding対象としてmimetype-profile-mappingsで登録
  • 自前のtranscodingスクリプトを設定する
  • その時mimetypeにREGZA用設定をぶち込む

<?xml version="1.0" encoding="UTF-8"?>
<config version="2" xmlns="http://mediatomb.cc/config/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mediatomb.cc/config/2 http://mediatomb.cc/config/2.xsd"><!--
     Read /usr/share/doc/mediatomb-common/README.gz section 6 for more
     information on creating and using config.xml configration files.
    -->
  <server>
    <ui enabled="yes" show-tooltips="yes">
      <accounts enabled="no" session-timeout="30">
        <account user="mediatomb" password="mediatomb"/>
      </accounts>
    </ui>
    <name>infinibit</name>
    <udn>uuid:199b2aad-3ff9-4b7f-b4e6-13e490cb7a90</udn>
    <home>/var/lib/mediatomb</home>
    <webroot>/usr/share/mediatomb/web</webroot>
    <storage caching="yes">
      <sqlite3 enabled="no">
        <database-file>mediatomb.db</database-file>
      </sqlite3>
      <mysql enabled="yes">
        <host>localhost</host>
        <username>mediatomb</username>
        <password>mediatomb</password>
        <database>mediatomb</database>
      </mysql>
    </storage>
    <protocolInfo extend="yes"/><!-- For PS3 support change to "yes" --><!--
       Uncomment the lines below to get rid of jerky avi playback on the
       DSM320 or to enable subtitles support on the DSM units
    --><!--
    <custom-http-headers>
      <add header="X-User-Agent: redsonic"/>
    </custom-http-headers>

    <manufacturerURL>redsonic.com</manufacturerURL>
    <modelNumber>105</modelNumber>
    --><!-- Uncomment the line below if you have a Telegent TG100 --><!--
       <upnp-string-limit>101</upnp-string-limit>
    -->
    <extended-runtime-options>
      <ffmpegthumbnailer enabled="yes">
        <thumbnail-size>160</thumbnail-size>
        <seek-percentage>5</seek-percentage>
        <filmstrip-overlay>yes</filmstrip-overlay>
        <workaround-bugs>no</workaround-bugs>
      </ffmpegthumbnailer>
      <mark-played-items enabled="no" suppress-cds-updates="yes">
        <string mode="prepend">*</string>
      </mark-played-items>
    </extended-runtime-options>
  </server>
  <import hidden-files="no">
    <filesystem-charset>UTF-8</filesystem-charset>
    <metadata-charset>CP932</metadata-charset>
    <scripting script-charset="UTF-8">
      <common-script>/usr/share/mediatomb/js/common.js</common-script>
      <playlist-script>/usr/share/mediatomb/js/playlists.js</playlist-script>
      <virtual-layout type="js">
        <import-script>/usr/share/mediatomb/js/import.js</import-script>
        <dvd-script>/usr/share/mediatomb/js/import-dvd.js</dvd-script>
      </virtual-layout>
    </scripting>
    <mappings>
      <extension-mimetype ignore-unknown="no">
        <map from="mp3" to="audio/mpeg"/>
        <map from="ogg" to="application/ogg"/>
        <map from="asf" to="video/x-ms-asf"/>
        <map from="asx" to="video/x-ms-asf"/>
        <map from="wma" to="audio/x-ms-wma"/>
        <map from="wax" to="audio/x-ms-wax"/>
        <map from="wmv" to="video/x-ms-wmv"/>
        <map from="wvx" to="video/x-ms-wvx"/>
        <map from="wm" to="video/x-ms-wm"/>
        <map from="wmx" to="video/x-ms-wmx"/>
        <map from="m3u" to="audio/x-mpegurl"/>
        <map from="pls" to="audio/x-scpls"/>
        <map from="flv" to="video/x-flv"/>
        <map from="mka" to="audio/x-matroska"/><!-- Uncomment the line below for PS3 divx support --><!-- <map from="avi" to="video/divx"/> --><!-- Uncomment the line below for D-Link DSM / ZyXEL DMA-1000 --><!-- <map from="avi" to="video/avi"/> -->
        <map from="ts" to="video/mpeg2ts"/>
        <map from="mpg" to="video/mpeg"/>
        <map from="mpeg" to="video/mpeg"/>
        <map from="mkv" to="video/x-matroska"/>
        <map from="mp4" to="video/mp4"/>
        <map from="avi" to="video/x-msvideo"/>
      </extension-mimetype>
      <mimetype-upnpclass>
        <map from="audio/*" to="object.item.audioItem.musicTrack"/>
        <map from="video/*" to="object.item.videoItem"/>
        <map from="image/*" to="object.item.imageItem"/>
        <map from="application/ogg" to="object.item.audioItem.musicTrack"/>
      </mimetype-upnpclass>
      <mimetype-contenttype>
        <treat mimetype="audio/mpeg" as="mp3"/>
        <treat mimetype="application/ogg" as="ogg"/>
        <treat mimetype="audio/x-flac" as="flac"/>
        <treat mimetype="image/jpeg" as="jpg"/>
        <treat mimetype="audio/x-mpegurl" as="playlist"/>
        <treat mimetype="audio/x-scpls" as="playlist"/>
        <treat mimetype="audio/x-wav" as="pcm"/>
        <treat mimetype="audio/L16" as="pcm"/>
        <treat mimetype="video/x-msvideo" as="avi"/>
        <treat mimetype="video/mp4" as="mp4"/>
        <treat mimetype="audio/mp4" as="mp4"/>
        <treat mimetype="application/x-iso9660" as="dvd"/>
        <treat mimetype="application/x-iso9660-image" as="dvd"/>
        <treat mimetype="video/x-matroska" as="mkv"/>
        <treat mimetype="audio/x-matroska" as="mka"/>
      </mimetype-contenttype>
    </mappings>
    <online-content><!-- Make sure to setup a transcoding profile for flv -->
      <YouTube enabled="no" refresh="28800" update-at-start="no" purge-after="604800" racy-content="exclude" format="mp4" hd="yes">
        <favorites user="mediatomb"/>
        <standardfeed feed="most_viewed" time-range="today"/>
        <playlists user="mediatomb"/>
        <uploads user="mediatomb"/>
        <standardfeed feed="recently_featured" time-range="today"/>
      </YouTube>
      <Weborama enabled="no" refresh="28800" update-at-start="no">
        <playlist name="Active" type="playlist" mood="active"/>
        <playlist name="Metal" type="playlist">
          <filter>
            <genres>metal</genres>
          </filter>
        </playlist>
      </Weborama>
      <AppleTrailers enabled="no" refresh="43200" update-at-start="no" resolution="640"/>
    </online-content>
  </import>
  <transcoding enabled="yes">
    <mimetype-profile-mappings>
      <transcode mimetype="video/mpeg2ts" using="ffmpeg"/>
      <transcode mimetype="video/mpeg" using="ffmpeg"/>
      <transcode mimetype="video/x-matroska" using="ffmpeg"/>
      <transcode mimetype="video/mp4" using="ffmpeg"/>
      <transcode mimetype="video/x-msvideo" using="ffmpeg"/>
      <transcode mimetype="video/x-flv" using="vlcmpeg"/>
      <transcode mimetype="application/ogg" using="vlcmpeg"/>
      <transcode mimetype="application/ogg" using="oggflac2raw"/>
      <transcode mimetype="audio/x-flac" using="oggflac2raw"/>
    </mimetype-profile-mappings>
    <profiles>
      <profile name="ffmpeg" enabled="yes" type="external">
        <mimetype>video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=10;DLNA.ORG_CI=0</mimetype>
        <!-- <mimetype>video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=01;DLNA.ORG_CI=0</mimetype> -->
        <accept-url>yes</accept-url>
        <first-resource>yes</first-resource>
        <accept-ogg-theora>yes</accept-ogg-theora>
        <agent command="/home/yoyo/mediatomb-ffmpeg-video" arguments="%in %out %seconds" can-seek="yes" />
        <buffer size="14400000" chunk-size="512000" fill-size="128000"/>
      </profile>
      <profile name="oggflac2raw" enabled="no" type="external">
        <mimetype>audio/L16</mimetype>
        <accept-url>no</accept-url>
        <first-resource>yes</first-resource>
        <accept-ogg-theora>no</accept-ogg-theora>
        <agent command="ogg123" arguments="-d raw -o byteorder:big -f %out %in"/>
        <buffer size="1048576" chunk-size="131072" fill-size="262144"/>
      </profile>
      <profile name="vlcmpeg" enabled="no" type="external">
        <mimetype>video/mpeg</mimetype>
        <accept-url>yes</accept-url>
        <first-resource>yes</first-resource>
        <accept-ogg-theora>yes</accept-ogg-theora>
        <agent command="vlc" arguments="-I dummy %in --sout #transcode{venc=ffmpeg,vcodec=mp2v,vb=4096,fps=25,aenc=ffmpeg,acodec=mpga,ab=192,samplerate=44100,channels=2}:standard{access=file,mux=ps,dst=%out} vlc:quit"/>
        <buffer size="14400000" chunk-size="512000" fill-size="120000"/>
      </profile>
    </profiles>
  </transcoding>
</config>
ここまで。
<mimetype>video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=10;DLNA.ORG_CI=0</mimetype>
 のDLNA.ORG_OP=10にしてタイムシーク有効ってことにするのと、
<agent command="/home/yoyo/mediatomb-ffmpeg-video" arguments="%in %out %seconds" can-seek="yes" />
で%secondsとcan-seek="yes"を書いておくのがポイント。

次、再エンコスクリプト。
mediatomb公式サイトのwikiに載ってたffmpegvideoを参考に、

  • 4:3の動画は左右に黒枠を追加
  • 16:9を越えるシネスコは上下に黒枠を追加
  • 16:9はそのまま
になるように自動で調整するようにしてみる。

出力は、19RE2に合わせ、

  • サイズ1280x720
  • mpeg2 8192k
  • 音声はmp2 2ch 44.1k 256k
  • ts
にしてみた。

音声のチャンネル数とサンプリング周波数は決め打ちにしないと、
変な音声含むファイルでNGになるので注意。

それと何故か、19RE2は頭の2秒を飛ばすようになってたので、その分を補正。

#!/bin/bash

time_ss=`echo "${3} - 2" | bc`

#width=`/usr/bin/mediainfo --Inform=Video\;%Width% "${1}"`
#height=`/usr/bin/mediainfo --Inform=Video\;%Height% "${1}"`
#dar=`/usr/bin/mediainfo --Inform=Video\;%DisplayAspectRatio% "${1}"`

stream_info=`/usr/local/bin/ffprobe -show_streams "${1}" 2>&1`
dar=`echo "$stream_info" | sed -e '/display_aspect_ratio/!d; s/^display_aspect_ratio=\([0-9]*:[0-9]*\).*/\1/' | sed 's/\:/\//'|bc -l`
width=`echo "$stream_info" | sed -e '/width=/!d; s/^width=\([0-9]*\).*/\1/'`
height=`echo "$stream_info" | sed -e '/height=/!d; s/^height=\([0-9]*\).*/\1/'`

echo ------ $width x $height DAR:$dar

if [ `echo "$dar == 0" | bc` -eq 1 ] ; then
  dar=`echo "$width/$height" | bc -l`
  echo ------ No DAR detected. overwrite by: $dar
fi

#target aspect ratio
tar=1.7777
comp_wide=1.78
comp_narrow=1.77

is_wide=0
is_narrow=0
pad=0

if [ `echo "$dar > $comp_wide" | bc` -eq 1 ] ; then
  # needs bars top and bottom
  is_wide=1
  pad=$(echo "scale=2; (($width/$tar)-$height)/2" | bc | awk -F '.' '{ print $1; exit; }' )
fi

if [ `echo "$dar < $comp_narrow" | bc` -eq 1 ] ; then
  # needs bars left and right
  is_narrow=1
  pad=$(echo "scale=2; (($height*$tar)-$width)/2" | bc | awk -F '.' '{ print $1; exit; }' )
fi

mod=$(($pad%2))
compmod=1
if [ "$mod" -eq "$compmod" ] ; then
  # pad must be an even number
  pad=$((pad+1))
fi

# Make sure the ffmpeg path is correct
if [ "$is_wide" -eq 1 ] ; then
   # bars top and bottom 
  echo ------ bars top and bottom
  echo ------ PAD: $pad
  exec "/usr/local/bin/ffmpeg" -ss "$time_ss" -i "${1}" -f mpegts -vcodec mpeg2video -b:v 8192k -acodec mp2 -b:a 256k -ar 44100 -ac 2 -vf "pad=0:$(($pad*2+$height)):0:$pad, scale=1280:720" -aspect 4:3 -threads 4 - > "${2}"
elif [ "$is_narrow" -eq 1 ] ; then
  # bars left and right
  echo ------ bars left and right
  echo ------ PAD: $pad
  exec "/usr/local/bin/ffmpeg" -ss "$time_ss" -i "${1}" -f mpegts -vcodec mpeg2video -b:v 8192k -acodec mp2 -b:a 256k -ar 44100 -ac 2 -vf "pad=$(($pad*2+$width)):0:$pad:0, scale=1280:720" -aspect 4:3 -threads 4 - > "${2}"
else
  # no bars
  echo ------ no bars
  exec "/usr/local/bin/ffmpeg" -ss "$time_ss" -i "${1}" -f mpegts -vcodec mpeg2video -b:v 8192k -acodec mp2 -b:a 256k -ar 44100 -ac 2 -s 1280x720 -aspect 4:3 -threads 4 - > "${2}"
fi
以上設定で、

  • TなTS
  • SなTS
  • DivX
  • H264
  • mpeg4
  • XviD
  • mkv
  • avi
なんかの、手元のファイル全てをトランスコードして再生可能(早送り巻き戻しも可能)になった。
原理的にffmpegが解釈出来る全動画を再生出来る…はず。CPUが足りれば。

Celeron G530使用で、SなTSをトランスコード再生するので7-80%の使用率。
ファイルサーバとしてファイル転送しているとコマ落ちする。

1 件のコメント:

  1. 初めまして、ハンドルネームherojinと申します。

    yoyorealさんのブログを大変興味深く拝読させていただきました。mediatombの問題回避できるスキルはうらやましい
    限りです。
    当方2006年購入のレグザZ2000を今も使っています。自宅サーバ(Ubuntu12.04>サーバ+Lubuntuデスクトップ)でsynapticからインストしたmediatomb0.12.1を走らせて宅内でDLNAクライアント(レグザとWindows7)から動画mp4、iso、tsファイルをリアルタイムトランスコードにより視聴できるようにしています。ところが、mp4とisoファイルはシーク&ポーズができていません。私もソースからコンパイルを試みましたが、うまくいきませんでした。
    大変勝手なお願いで申し訳ありませんが、yoyorealさんのmediatombの実行ファイルをご提供いただけないでしょうか。できればubuntu用debファイルでブログにアップいただけると助かります。
    ご検討を宜しくお願いします。

    返信削除