BMS2でトランスコード配信時に固定量子化を選べるようLuaスクリプトを変更した

久しぶりの投稿になってしまいました。年末年始ず~っと、Nexus9かZ3 tablet compactかどちらを買うか悩んでました。レビューを書くつもりだったのに未だに買ってません。
何に使うかというとBMS2でビデオをDLNAで見るためだけと言ってもいいです。スピーカーでまともな音が出るのが欲しいのでNexus9なんですけど、BDレコーダーのビデオも見たいしSDカードが使えるZ3 tablet compactも捨てがたい。

決断できないでいる中、BMS2のトランスコード再生で不満に思っていた事が気になりだしました。

ffmpegを使ってトランスコードする時はビットレート指定のmpegtsを使っています。ビットレート指定だと動きの激しい場面でブロックノイズが目立ちます。ビットレートを上げればいいのですが、動きの少ないシーンでは無駄にデータを送る事になり無線の通信速度が足りない場所ができたりします。
そんな時のためにQSVの固定品質を使えるようにしたのですが、QSVは4段のパイプ処理をしているため再生までの反応が遅くてイライラします。
ffmpegの固定量子化を使えるようにすれば解決するなぁ、と以前から思っていたのでした。記事のネタにも困っていたので固定量子化を指定できるようにしてみました。


ffmpegのmpegtsで固定量子化を使うにはqscaleオプションを指定するだけです。x264みたいな固定品質では無いですがビットレート指定より帯域を無駄に消費する事が無くなり良さそうです。

qscaleでは1~31の品質値を設定できますがいくつにするのが良いのでしょうか?適当に変えながら試しました。もしかしたら固定量子化のような可変ビットレートではビエラやレグザが再生できないかもしれません。
幸い、レグザもビエラも問題なく固定量子化を使っても再生できました。お持ちの機器によっては同じように応用はできないかもしれません。

次に品質値はいくつにすれば良いのでしょうか?1が一番良い品質、31が一番悪い品質のようです。
今回の記事執筆時の品質値は以下の式で計算しています。


x,yはトランスコードした後の解像度です。フルHDならば7に、320x240ドットならば2.2ほどになるようにしました。もうちょっと大きな値にしても良いかもしれません。
映像にもよりますが、ピークのビットレートは20Mbps程度を目安にしました。動きが無ければ音声の帯域の方が大きいくらいです。
今までの固定ビットレートではフルHD時10Mbpsになるよう計算していましたので、動きの激しいシーンが連続してもブロックノイズは目立たなくなっています。

最初はフルHDでqscale値6になるようにしていましたが動きの激しいシーンで音声と映像のずれが生じてしまう場合がありました。CPUのトランスコード処理が間に合わなかったのかテレビ側で処理できなかったのかの区別がついていません。お使いのサーバーの能力に合わせて調整する必要があるかもしれません。

ところで、解像度が低ければ品質値を上げて、解像度が高ければ品質値を下げるんじゃないの?なんて疑問を持つ方がいらっしゃるかもしれませんのでちょっと説明を追加しておきます。
量子化とかx264の品質などの値は基本的に8x8ドット単位での話です。8x8ドットに対していくつの値で処理するかというだけで映像の縦横のドット数は関係ありません。
重要なのは映像の8x8ドットが再生時にどのくらいの大きさになるのかという事です。テレビでフルHDを再生すると8x8ドットなんて小さな面積です。同じテレビで320x180ドットの映像を映したらどうでしょう?横・縦とも1/6のドット数ですがテレビには同じ大きさで表示されます。すると8x8ドットの面積はフルHDと比べて36倍にもなってしまいます。ドットで見れば低解像度の映像ほど拡大されて表示しているからです。
拡大されているので粗も目立ちます。そのため低解像度ほど品質値を上げておかなくてはいけません。
また、小さな画面のスマホで見るのとプロジェクタなど100インチで見るのとでは見た目の8x8ドットの面積が違いすぎます。当然、スマホの方が品質を落としても粗は目立ちません。

この他に、しばらく気づかなかったのですがいつの間にかFlash Videoをトランスコードしないスクリプトとなっていました。修正してFlash Videoもトランスコード再生するようにしました。Flash Videoは特殊なフレームレートを使ったものも多いので、全てトランスコード再生できるとは限りません。

それでは新しいLuaスクリプトを BMS2用Luaスクリプト ページに置いておきます。UseQscaleという変数をtrueにすると固定量子化を使います。

コメント

最近のコメント

Threaded Recent Comments will be here.