Date Modified Tags linux

Universal Media Server(UMS)で立てたDLNAサーバにiPhoneやPanasonic Digaでアクセスしようとしたらハマったので、その間のノウハウをまとめておく。

参考にした記事

DLNA設定

~/.config/UMS/UMS.confにUniversal Media Serverの設定を書く

対象にするフォルダは

folders = /path/to/folder1, /path/to/folder2

とカンマ区切りで書く

前の記事でサービス設定ファイルを作っているので設定の反映は

sudo systemctl restart ums.service

でおk

iPhoneでdlnaサーバからストリーミングで動画を見る

iPhoneで動画を見る場合は、dlnaクライアントのアプリを入れてやれば良い。 dlnaクライアントのアプリは何個もあるが、

PlayerXtremeが良い感じだった。

アップグレードして!というメッセージがちょくちょく出るのに目を瞑れば問題ない。

視聴手順は

  • アプリを開く
  • 右下メニューのNETWORKを選ぶ(広告のボタンが重なっているので、しばらく待つか移動させれば選べる)
  • DiscoveredからUniversal Media Serverが見つかるはずなのでそれを選択
  • 視聴したいファイルを探して(Media Library -> ビデオ -> 日付別かすべてのビデオ が無難?)タップすれば視聴できる

ちなみにVLC for iphoneは最初ダメみたいに見えるけど、起動してしばらくしたら問題なく使用できた。こっちでも良いかもしれない。

digaでdlnaサーバからストリーミングで動画を見る

これはハマった。本当にハマった。 とりあえずそのまま視聴しようとしても全く見ることが出来ない。 調べてみると

nas上のMP4が再生できないのは、旧digaの仕様です。 wmp12から再生できるのは、wmp12がMpeg2にトランスコードして配信しているためです。

とあって、どうもMpeg2のトランスコード形式にしないとうまく表示出来ないっぽい。

で、まずはログを確認しないと何も出来ないなということで、ログを探ってみた。 ログは

~/.config/UMS/debug.log

に存在する。チェックしてみると、UMSは

  • ファイルの情報を読み込む
  • 情報にマッチしたレンダラー(renderer)を読み込む
  • レンダラーの指示に従ってそのまま配信、またはffmpegでトランスコードして配信する

という流れで動いている。

で、マッチしてるレンダラーを調べて見ると

Matched media renderer "Sony Xperia Z/ZL/ZQ/Z1/Z2"

なぜかSony Xperiaがマッチしていた。UMSの掲示板を調べると、どうも何にもマッチしなかったらSony Xperiaが選ばれるらしい。

ということはマッチするレンダラーを書かないと視聴出来ないということになる。

ここからはもっと細かくログを取る必要があるので、設定を変更した。

ログレベルを変える

ログレベルを変えるには

/path/to/ums/logback.headless.xml

を編集すると良い。TRACEよりALLの方が沢山ログを出せると思うので、

    <logger name="net.pms.dlna.DLNAResource" level="ALL" />
    <logger name="net.pms.network.RequestHandlerV2" level="ALL" />
    <logger name="net.pms.util" level="ALL" />

<logger name="org.apache" level="WARN" />

の前に挿入した。

レンダラーのマッチ部分を書く

/path/to/ums/renderer/の中にレンダラーファイルが沢山入って居るので、読みながらどうやってレンダラーを選んでいるのか調べてみた。UMSのサイトにあるFAQとDefaultRenderer.confにどんな基準になるかが書いてある。

FAQによると、

  • /path/to/ums/renderer/Hoge.conf みたいなファイルを作って
UserAgentSearch = This should not match anything
UserAgentAdditionalHeader = 
UserAgentAdditionalHeaderSearch =

という形で書いておく

  • UMSを立ち上げて、Digaでdlnaサーバにアクセスしてなにか動画にアクセスしてみる。
  • UMSを終わらせる
  • denug.logを開いて「User-Agent」(大文字小文字は色々)という文字列を含むところを見る。Digaの場合「USER-AGENT: Panasonic-UPnPSDK/1.00 DLNADOC/1.50」と書いてあった。
  • この文字列にマッチするように条件を書く
UserAgentSearch = Panasonic
UserAgentAdditionalHeaderSearch = Panasonic

(UserAgentAdditionalHeaderは削った)

これでDigaでDlnaにアクセスした時にHoge.confがマッチしてくれるようになる。

レンダラーのトランスコーディング部分を書く

トランスコーディングはPanasonicの他のレンダラーのものをそのままコピペで大丈夫。例えばこんな感じ

SeekByTime = exclusive
DLNALocalizationRequired = true
TranscodeVideo = MPEGTS-MPEG2-AC3
TranscodeAudio = WAV
TranscodeFastStart = true
TranscodedVideoFileSize = 1000000
KeepAspectRatio = true
SendDateMetadata = false
MediaInfo = true

レンダラーのサポートされているエンコード指定を書く

サポートされているエンコードは全然情報がなかったので、Mpeg2のトランスコードだけにしておく。書き方は他のレンダラーのものを参考にした。音はac3, aac, mpaをサポートしたが、音が出ないケースがあったので、余計な設定があるっぽい。

Supported = f:mpegts   v:h264|mpeg2   a:ac3|aac-lc|mpa        m:video/mpeg
Supported = f:mpa    m:audio/mpeg
Supported = f:m4a    m:audio/x-m4a
Supported = f:mp3    m:audio/mpeg
Supported = f:wav    m:audio/L16
SupportedInternalSubtitlesFormats = ASS,SUBRIP

ffmpegのログを出せるように設定

これだけ設定すると、とりあえずネットでダウンロードできるようなmp4の動画は見ることが出来た。しかし、iPhoneの動画は見ることが出来ない。そこで、ffmpegのログを見たくなったのだが、ffmpegはUMS内部で動くので、初期状態ではログを見ることが出来ない。

調べて見ると、レンダラーにffmpegのオプションを追加する項目があったので、そこを編集することでログを取って見た。

CustomFFmpegOptions = -loglevel debug

これをレンダラーに追記するとffmpegのログをdebug.logに出してくれるようになった

iPhoneの動画を視聴する

ここまでやってもiPhoneで記録されるmovファイルは直接トランスコード出来てないので、ubuntu側でmovをMpeg2トランスコードにエンコードすることで視聴できるかやってみた。

すると、「File "hoge.ts" will not be streamed because the resolution is incompatible with the renderer.」みたいなメッセージを確認出来た。どうも決まった解像度の動画でないと読み込まないらしい。 それから「アスペクト比が16:9でない」というメッセージも出ていた。

ということはiPhoneで縦向きに取った映像の場合はアスペクト比が16:9になるように調整しないといけない。さすがにレンダラーにやってもらうのは難しそうなので、手動で行う。

手動でffmpegを行う場合、できることがとても広いので、少しずつ試してみて何が最適かを調べる方法を取ってみた。

まずは

ffmpeg -i hoge.mov

でコーデックを調べた

基本的にはコーデックは大丈夫みたいだったので

ffmpeg -i hoge.mov -c copy output.ts

でそのまま変換はできる。横向きの動画はこれだけで表示できるようになった。 まずは解像度を調整するためにscaleオプションを入れてみる。オプション中の「-1」は自動調整という意味。

ffmpeg -i hoge.mov -vf "scale=-1:720" output.ts

やはりアスペクト比を16:9にしてないので視聴できない。アスペクト比のオプションを次に入れてみる

ffmpeg -i hoge.mov -vf "scale=-1:720" -aspect 16:9 output.ts

こうすると視聴できるようになった。しかしアスペクト比の調整のせいで、横に引き伸ばされた映像みたいになってしまった。そこで、余白を入れて見ることにした。

ffmpeg -i hoge.mov -vf "scale=-1:720,pad=1280:720:437:0:black" -aspect 16:9 output.ts

こうすると縦向きの動画をDigaでちゃんと表示できるようになった。

dlnaのフォルダにmovが追加されて、縦向きの動画だった場合、この処理を自動で行うようにすればよさそうだ。