Universal Media Server(UMS)で立てたDLNAサーバにiPhoneやPanasonic Digaでアクセスしようとしたらハマったので、その間のノウハウをまとめておく。
参考にした記事
- DebianでUniversal Media Serverを運用する
- 『NASにあるMP4ファイルをお部屋ジャンプリンクで再生できません』のクチコミ掲示板
- VLC for Desktop detected as Sony Xperia
- How to change to TRACE Logging
- DefaultRenderer.conf
- Universal Media Studio FAQ
- Universal Media Server (UMS) で異なるファイル形式,縦横比,解像度に一括して対応するためのレンダラー(renderer)設定メモ
- DIGA BZT720で DLNA動画再生テスト 3
- FFmpegによる動画エンコードの基本
- 最新ffmpegオプションまとめ
- ffmpegのオプションを決めていく手順みたいなもの?
- FFmpeg wiki Scaling
- 新配信で4:3映像に余白をつけて800×450配信にする
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が追加されて、縦向きの動画だった場合、この処理を自動で行うようにすればよさそうだ。