2018年4月6日金曜日

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


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

 Universal Media Server(UMS)は動画ファイルを解析し,TVの対応しているコーデックかどうかを判定している。TVが対応していればそのまま転送し,そうでなければ対応する形式に変換して転送(トランスコード)している。しかし,TVはPCのように柔軟性が高くない。対応しているコーデックでも,プロファイルやレベルの違いなどで再生できないことが多い。だから,対応している(はずの)コーデックと判定され,そのまま転送されても,TV側で上手く再生できないことが多い。
 そこで,UMSは常にトランスコードするように設定すればよい。動画ファイルには様々なコーデックがあるが,トランスコードされれば一律となるからである。TV側はそのトランスコード後の,ただ一つのコーデックにさえ対応していればよい。そもそも,TV側で対応していない動画でも,PCは柔軟性が高いから再生できる。つまり大抵の動画はPCでは変換でき,TVにトランスコードできる。PCで変換できないようなファイルはTVで再生できる見込みがない。
 一方,トランスコードの問題点はPCのCPUとネットワークの帯域とを食うことである。しかし,CPUの性能も上がってきている。ネットワークも,たとえ無線であっても802.11acなどでは100Mbps以上の帯域が当たり前になっている。だから,常にトランスコードするようにしておいても大丈夫である。

 トランスコードの設定はUMSの変換設定のタブにもある。しかしここでは細かい設定はできない。だからrenderersフォルダにあるconf設定ファイルで行う。DefaultRenderer.confファイルは設定の説明があるので参考になる。

 常にトランスコードするためには,自身のTVに対応するconfファイルを編集する。confファイルにはUMSのステータス画面で表示される自身のTVアイコンをクリックし,表示されたウインドウからもたどり着くことができる。
confファイルをメモ帳などで開いたら,Supported = の設定を項目ごとすべて消去する。Supported = にあるコーデックはトランスコード無しで伝送されるからである。
そしてTranscodeExtensions = の項目を見つけるか,なければ追加する。TranscodeExtensions = の項目には自身の知る限りの動画ファイルの拡張子を追加しておく。TranscodeExtensions = に設定された拡張子のファイルは常にトランスコードされる。
 例えば,

TranscodeExtensions = dvr-ms,dvr,mkv,dv,ty,mov,ogm,hdmov,hdm,rmv,rmvb,rm,asf,evo,asx,flv,m2v,mpe,mpg,mod,tivo,ty,tmf,ts,tp,m2p,mp4,m4v,avi,wmv,wm,divx,div,flac,mlp,fla,wma,m4a,aac,mp3,dts,mka,ape,ogg,shn,mpc,ra,mp2,wv,oma,aa3,gif,png,arw,cr2,crw,dng,raf,mrw,nef,pef,tif,tiff

のようにしておく。画像ファイルなども含まれてしまっているが,多すぎて困ることはない。

 次にトランスコードの設定をする。ここで変換して転送される動画の画質が決まる。まず,UMSのGUIにある変換設定タブの動画品質(MPEG-2)設定は,複雑な設定に向かないので基本的に使用しない。confファイルでの設定と衝突するので本当は空にしておきたいが,GUIの仕様か空にはできない。そこでGUIの動画品質(MPEG-2)設定は,keyint=6とだけ設定する。自動(有線)などの設定のままにしておいてはならない。キーインターバルは長すぎると音ズレが起きやすくなるので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で十分である。地上波などは18000kもないそうだ。値が大きいほど高画質だが,ネットワークの帯域やTVの処理能力を超えるとカクカクになる。自身の環境に合わせて調節する。大きくても24000kぐらいだろう。
 -bufsizeは-b:vの1/4~1/2とする。これはkeyint=6だからである。24コマの動画についてキーフレームを6コマとすると,1/4秒ごとにキーフレームがある。-bufsizeが小さいと,キーフレームの大容量に対応できず1/4秒ごとに画質が極端に低いコマが生じる恐れがある。一方-bufsizeが大きすぎると,動きの激しい場面などで瞬間的に帯域が-maxrateの値を大きく超えてしまい,ネットワークの帯域やTVの処理速度を超えてカクつく恐れがある。だから-bufsizeは-b:vの1/4~1/2となる。
 TranscodeVideo = は最も基本的な形式であるプログラムストリーム,MPEG2,AC3が安全である。上記のように20Mbpsの帯域があればH.264などを使用する必要性は低い。トランスポートストリームだと動画の末尾で途切れるTVもある。

縦横比の問題

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

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

としておく。
 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 = dvr-ms,dvr,mkv,dv,ty,mov,ogm,hdmov,hdm,rmv,rmvb,rm,asf,evo,asx,flv,m2v,mpe,mpg,mod,tivo,ty,tmf,ts,tp,m2p,mp4,m4v,avi,wmv,wm,divx,div,flac,mlp,fla,wma,m4a,aac,mp3,dts,mka,ape,ogg,shn,mpc,ra,mp2,wv,oma,aa3,gif,png,arw,cr2,crw,dng,raf,mrw,nef,pef,tif,tiff
CustomFFmpegOptions = -b:v 20000k -maxrate 20000k -minrate 20000k -bufsize 10000k
OverrideFFmpegVideoFilter = scale=1920:1080
RescaleByRenderer = true
KeepAspectRatio = true
KeepAspectRatioTranscoding = true

0 件のコメント:

コメントを投稿