2018年4月6日金曜日

Universal Media Server (UMS) で異なるファイル形式,縦横比,解像度に一括して対応するためのレンダラー(renderer)設定メモ

何が問題か?

Universal Media Server(UMS)は素晴らしい。
しかし,上手くTVで再生できないファイルがある…PCでは再生できるのに…

原因は,TVが気難しいからである。
コンテナが合わない,コーデックが合わない,プロファイルが,レベルが合わない…

ではどうすればよいか。
もともと,UMSにはテレビに合わせてファイルを変換する機能がある(「トランスコード」という。)。
しかし,UMSは賢いので,TVが対応しているならばトランスコードしないでファイルを送るようになっている。
この機能をオフにして,常にトランスコードすればよい。
Core i3以降のCPU,802.11n以降の無線ネットワークにはその余裕がある。

異なるファイル形式に対応する方法

トランスコードの設定はrenderersフォルダにあるconf設定ファイルで行う。
自身のTVに対応するconfファイルを編集する。
画像ではBravia EX700用の設定を追加してある

なお,GUIからもconfファイルを開くことができる。
ステータス タブで設定したいTVをクリック

画像のようなダイアログが出たら赤丸部分のボタンをクリック


confファイルをメモ帳などで開いたら,Supported = の設定を項目ごとすべて消去する。
Supported = にあるコーデックはトランスコード無しで伝送されるからである。
赤丸部分を削除

そしてTranscodeExtensions = の項目を見つけるか,なければ追加する。
TranscodeExtensions = の項目には自身の知る限りの動画ファイルの拡張子を追加しておく。
TranscodeExtensions = に設定された拡張子のファイルは常にトランスコードされる。

例えば,

TranscodeExtensions = mkv,flv,mpg,mpeg,mp4,webm,3gp,m4v,avi,mov,qt,wmv,asf,ts,m2t,m2ts

のようにしておく。
他にもあれば適宜追加する。
mp4とmkvがあれば大体いいだろう。

次にトランスコードの設定をする。
ここで変換して転送される動画の画質が決まる。
まず,UMSのGUIにある変換設定タブの動画品質(MPEG-2)設定は,複雑な設定に向かないので基本的に使用しない。
ここはconfファイルでの設定と衝突するので本当は空にしておきたいが,GUIの仕様か空にはできない。

そこでGUIの動画品質(MPEG-2)設定は,

keyint=6

とだけ設定する。
自動(有線)などの設定のままにしておいてはならない。
自動で問題ない場合が多いが,TVは最大ビットレートなどにも気難しいため,自分で固定ビットレートにしておいた方が安心である。
FFmpegのみ有効,GPUアクセラレーションはオフ,動画品質で「keyint=6」のみ設定


キーインターバルは長すぎると音ズレが起きやすくなるので6~8程度が良い。
これは実際にはGOPの設定である。
つまりkeyint=6にしておくと,Iフレームが6フレームごとにやってくる。

なお,ビデオエンジンはFFmpegのみ有効にし,tsMuxeRに切り替える設定をオフにしておく。

本番の設定は先ほどのconf設定ファイルである。

TranscodeVideo = MPEGPS-MPEG2-AC3
CustomFFmpegOptions = -b:v 20000k -maxrate 20000k -minrate 20000k -bufsize 10000k

とする。
-b:vと-maxrateと-minrateは同じ値にするとCPUの負担が少ない。
数値はお好みだが,フルHDであれば20000kで十分である。
値が大きいほど高画質だが,ネットワークの帯域やTVの処理能力を超えるとカクカクになる。
自身の環境に合わせて調節する。
大きくても24000kぐらいだろう。

-bufsizeは-b:vの1/4~1/2とする。
なぜならGUIの方でkeyint=6としたからである。
24フレームの動画でキーインターバルを6フレームとすると,1/4秒ごとにIフレームがくる。
-bufsizeが小さいと,Iフレームの大容量に対応できず1/4秒ごとに画質が極端に低いフレームが生じる恐れがある。
一方-bufsizeが大きすぎると,動きの激しい場面などで瞬間的に帯域が-maxrateの値を大きく超えてしまい,ネットワークの帯域やTVの処理速度を超えてカクつく恐れがある。
だから-bufsizeは-b:vの1/4~1/2がよい。

TranscodeVideo = は最も基本的な形式であるプログラムストリームのMPEG2,AC3が安全である。
H.264は対応するプロファイル,レベルがTVによって異なり設定が難しくなる。

異なる縦横比に対応する方法

4:3の動画や,映画などで16:9より細長い動画がTVでは歪んでしまうことがある。
これもPC側で処理すれば問題が生じにくい。

conf設定ファイルに

OverrideFFmpegVideoFilter = scale=1920:1080
KeepAspectRatio = true
KeepAspectRatioTranscoding = true

OverrideFFmpegVideoFilter = scale=w=trunc(ih*dar/2)*2:h=trunc(ih/2)*2,setsar=1/1,scale=w=1920:h=1080:force_original_aspect_ratio=1,pad=w=1920:h=1080:x=(ow-iw)/2:y=(oh-ih)/2:color=#000000
RescaleByRenderer = true
KeepAspectRatio = false
KeepAspectRatioTranscoding = false

としておく。
こちらの記事から写させていただきました。すばらしい!

KeepAspectRatio = は,4:3などの動画の左右などに黒帯をつけて強制的に16:9にしてくれる。
OverrideFFmpegVideoFilter = にあらかじめpad=max(iw\\,ih*16/9):max(ih\\,iw/16*9):(ow-iw)/2:(oh-ih)/2, setdar=4/3などと設定されていることがあるが,これはKeepAspectRatio = と被る設定であるから消しておく。

OverrideFFmpegVideoFilter = にはscale=1920:1080と設定しておく。
これで転送される動画の解像度は常にフルHDとなる。
以上でPCから送り出す動画は縦横比にかかわらず常にフルHDとなりTV側での問題が生じにくい。

なおconf設定ファイルにはRescaleByRenderer = falseという設定も出来る。
これの機能はOverrideFFmpegVideoFilter = scale=1920:1080と似ているが,上手くいかないことが多い。
だからRescaleByRenderer = falseを使ってはならない。


見本


TranscodeVideo = MPEGPS-MPEG2-AC3
TranscodeExtensions = mkv,flv,mpg,mpeg,mp4,webm,3gp,m4v,avi,mov,qt,wmv,asf,ts,m2t,m2ts
CustomFFmpegOptions = -b:v 20000k -maxrate 20000k -minrate 20000k -bufsize 10000k
OverrideFFmpegVideoFilter = scale=w=trunc(ih*dar/2)*2:h=trunc(ih/2)*2,setsar=1/1,scale=w=1920:h=1080:force_original_aspect_ratio=1,pad=w=1920:h=1080:x=(ow-iw)/2:y=(oh-ih)/2:color=#000000
RescaleByRenderer = true
KeepAspectRatio = false
KeepAspectRatioTranscoding = false