以前、Sony nasneに重い(40 Mbpsくらい)MP4を置いてPanasonic Vieraのお部屋ジャンプリンクで見ようとしたがカクカクして正常に見られなかった。
そのときは「nasneがヘボい」「Vieraがヘボい」「nasneとVieraを802.11n化してつなぐ私が悪い」のどれかかと思っていたがそうでもないらしい。結果として、MP4ではなくMPEG-2 TSなら問題なかった。
以下は、nasneがヘボいと思ったのでMac miniのDLNAサーバ化を試してみた記録と、それに伴い発覚したffmpeg等のドキュメント化されていない仕様の備忘録である。
Universal Media Serverに出会うまで
まず、Serviioを知った。ほかにもあるらしいので探しているうちに試さず仕舞い。
次にKODIを知る。インストールしてみたが、基本はメディアセンターアプリケーションなので10フィートUIがサーバとして使うには気に入らず撤退。
Embyが気になる。オープンソースとしてフォークしたJellyfinがあることがわかったのでこちらを試した。設定の段階で気に入らず。結局のところ、いろいろネットから持ってきて画像とか字幕とかタグ付けする試みが興味ないのである。映画とか溜めて観る分にはよさそうだけど、今回のようなただ観るのを試す目的にはシンプルなのが一番なのである。
困ったので10年以上前に使ったことがあるPS3 Media Serverを使ってみようと考えた。当然開発は止まっていたが、後継としてUniversal Media Server (UMS)が存在することがわかったのだ。
Plexは試さなかった。
参考
Universal Media Serverを試す
以前PS3 Media Serverを使っていた印象の通り、使えるまでの設定がシンプルだった。ちょっとこだわろうと思うと.confファイルを編集する必要があるが、単純明快でよい。
GUIの設定項目でいじった主なところは以下。
- 一般設定
自動で最大帯域幅を調整します:オフ(トランスコードされてしまうので) - 表示設定
ファイル名を見やすく:オフ(拡張子を表示するため)
拡張子を非表示:オフ
「メディアライブラリ」フォルダーを表示:オフ - トランスコード設定
変換に使用するCPUコア数:2(物理コア数と同じに)
すべての設定項目は「一般設定 > UMS構成ファイルを手動で編集します」または~/Library/Application\ Support/UMS/UMS.conf
から直接編集できる。
この辺は謎のタイミングで追加された。
ffmpeg_available_gpu_acceleration_methods = none,auto,videotoolbox
cred.path = /Users/xxxx/Library/Application Support/UMS/UMS.cred
engines = FFmpegVideo,MEncoderVideo,tsMuxeRVideo,VLCVideo,FFmpegAudio,tsMuxeRAudio,FFmpegWebVideo,VLCWebVideo,VLCVideoStreaming,MEncoderWebVideo,VLCAudioStreaming,DCRaw
engines_priority = FFmpegVideo,MEncoderVideo,tsMuxeRVideo,VLCVideo,FFmpegAudio,tsMuxeRAudio,FFmpegWebVideo,VLCWebVideo,VLCVideoStreaming,MEncoderWebVideo,VLCAudioStreaming,DCRaw
項目名がわからないときは/Applications/Universal Media Server.app/Contents/Resources/UMS.conf
を参照。
トランスコードさせない
UMSはレンダラーでサポートされてなさそうなファイルは積極的にトランスコードしてくる。それが魅力なのだが品質にこだわると邪魔になる。
まずはレンダラーデバイスごとの設定ファイルを作成する。ステータス画面からデバイス画像をクリックし、いろいろするとデバイスの設定ファイルが~/Library/Application\ Support/UMS/renderers/
に.confファイルとして自動的に作成される。自分で用意してもよい。
/Applications/Universal Media Server.app/Contents/Resources/renderers/
のファイルの中から近いものを参考にすること。すべての設定項目は同ディレクトリのDefaultRenderer.confに書いてある。
このデバイスの.confファイルのSupported
の項目を満たさないファイルはトランスコードされる。問題は音声である。PCMは(できた気がするが)mpegtsにmuxできない。AC-3の音質は信用していない。ffmpegのAACはヘボい。というわけで、afconvertを使いAACにエンコードしたファイルをあらかじめ用意しておきトランスコードはさせない。
[追記 2022/08/04] PCMは、ffmpegでpcm_bluray
コーデックを使うとM2TSに無圧縮でmuxできた。signed 16|20|24-bit big-endianに相当するらしい。どっちにしろVieraでは再生できない。
トランスコードがどう動いているか(ffmpegのエンコード設定はどうなっているか)を追うためにデバイスの.confファイルに以下を記述しておく。
CustomFFmpegOptions = -loglevel verbose
そして、UMSのトレース画面のフィルターを「デバッグ」に、Line Bufferの値を大きくしてVieraで再生開始しながらログを眺める。トランスコードされていれば(ffmpegを最優先にしている場合)ffmpegのコマンドラインが現れるはずなので表示されなければ成功である。
トランスコードをグローバルに無効にする場合は、~/Library/Application\ Support/UMS/UMS.conf
にdisable_transcoding = true
を記述する。
ffmpegのmpegts muxer仕様
Vieraの場合、M2TSだとAACの音が出ないがTSだと出た。これは拡張子の問題ではない(.tsでも.m2tsでもよい)。ファイルフォーマットの問題である。
ffmpegは出力ファイル名拡張子を見て自動でコンテナフォーマットを決めてくれるが、このせいで音が出ない場合がある。ffmpeg ... out.ts
だと出るがffmpeg ... out.m2ts
では出ない。mpegtsに2種類あることは知っていたが、出力ファイル名のわずかな違いのせいでこんなことになるとは思わなかった。mediainfoに食わせてみると、.tsだとMPEG-TS
、.m2tsだとBDAV
と表示される。PIDやコーデックIDも異なる。繰り返すが、拡張子の問題ではなくffmpegの自動認識の問題なので後でリネームしても変わらない。
ffmpeg -h muxer=mpegts
で調べるとそういうオプションがあった。
-mpegts_m2ts_mode <boolean> E.......... Enable m2ts mode. (default auto)
まとめると、
ffmpeg ... out.ts
-> MPEG-TSffmpeg ... out.m2ts
-> BDAVffmpeg ... -f mpegts out
-> MPEG-TSffmpeg ... -mpegts_m2ts_mode 0 out.xxx
-> MPEG-TSffmpeg ... -mpegts_m2ts_mode 1 out.xxx
-> BDAV
(余談1)afconvertのディザリング仕様
余談であるが、PCM対応を試している過程で24 bit PCMを16 bit PCMにダウンコンバートすることがあった。考えてみるとこれってディザリング必要だよなと。調べるとオプションがあった。
--dither algorithm
algorithm: 1-2
1、2って何やねんと。
verboseで実行してみると手がかりがあった。1だとTPDFDitherConverter 0x7fc1f7805ea0
、2だとNoiseShapingDitherConverter 0x7f8719d05f70
という文字列が確認できる。
1のTPDFとはTriangular Probability Density Functionのことだろう。そして、2は何らかのノイズシェイピングを行なっているのだろう。このことから考えると、大抵の音声信号では--dither 2
の方が好ましい。
(余談2)afconvertでCBRのAACが
256000
bpsじゃないと-s 0
指定してもできない。前できたような?