nicolish!
Variability
最終更新:
Bot(ページ名リンク)
-
view
Valiability
VBRでのビットレートの可変度合いを調整するための方法
01.ソース詳細、下準備
ソース映像の詳細です
オリジナルは147秒、800x600、30fpsの動画です。
オリジナルは147秒、800x600、30fpsの動画です。
それを早送りと通常速度の2回再生する動画にします
- 冒頭は4倍速(36秒)、残りは標準速度
- 全体で183秒、早送り区間は全体の20%
で、できた動画をエンコード。
今回はあくまでエンコード設定の比較なので
フィルタはサイズ変更と上下反転処理のみ
エンコード、フィルタにはVirtualDubを使用しています
エンコ設定のベースは次のような感じ
今回はあくまでエンコード設定の比較なので
フィルタはサイズ変更と上下反転処理のみ
エンコード、フィルタにはVirtualDubを使用しています
エンコ設定のベースは次のような感じ
1ページ目-General-
- エンコード設定は2pass -Best Quality-
- ビットレートは200kbps。undershootは初期値(90%)
- 自動キーフレームON、最大キーフレーム間隔300フレーム
- シャープネス、ノイズ低減は0
2ページ目-Advanced-
- Adjust Quantizerは初期値(オン、4-56)
- Resample関係は初期値(全部オフ)
さて、グダグダ話す前に事実確認。
「本当に、高速再生区間があると画質って落ちるの?」
まずは結果を。
「本当に、高速再生区間があると画質って落ちるの?」
まずは結果を。
fig1
矢印の辺りが分かりやすい
矢印の辺りが分かりやすい
上は元の動画を同じ設定でエンコードした結果
下は高速再生区間を含む動画をエンコードした結果
標準速度部分の、同じシーンを切り出したものです
うん、一安心。ってところで一旦仕切り直し。
下は高速再生区間を含む動画をエンコードした結果
標準速度部分の、同じシーンを切り出したものです
うん、一安心。ってところで一旦仕切り直し。
ここまでのまとめ
- 高速再生区間があると、通常速度部分の画質が落ちる
- 今回は、冒頭に4倍速の動画をくっつけた動画で検証
02.高速再生で画質が劣化するわけ
ここからは理屈の話。
そもそも、何故高速再生動画をエンコードすると
高速再生部分以外の画質が劣化するのでしょう?
そもそも、何故高速再生動画をエンコードすると
高速再生部分以外の画質が劣化するのでしょう?
VBR(可変ビットレート)エンコードでは
圧縮効率の向上のため、時間ごとのビットレートを変動させます
ある瞬間は100kbps、他の瞬間は500kbps、のように。
ビットレートが何かについては過去動画をご参照ください。
圧縮効率の向上のため、時間ごとのビットレートを変動させます
ある瞬間は100kbps、他の瞬間は500kbps、のように。
ビットレートが何かについては過去動画をご参照ください。
この際、圧縮がしにくい場所に大きなデータ量を割り当てます
圧縮がしやすい場所、しにくい場所に関わりなく
画質が一定になるようなエンコードを行なっているわけです
圧縮がしやすい場所、しにくい場所に関わりなく
画質が一定になるようなエンコードを行なっているわけです
早送り時は、時間当たりの映像の変化が大きくなります
このような場所は、圧縮効率が悪くなります
(何故悪くなるかは**で)
このような場所は、圧縮効率が悪くなります
(何故悪くなるかは**で)
従って、エンコード時に
早送り区間には大きめのビットレートが割り当てられます
その分、その他の区間のビットレートを下げて帳尻を合わせます
早送り区間には大きめのビットレートが割り当てられます
その分、その他の区間のビットレートを下げて帳尻を合わせます
非早送り区間では、実質的にビットレートが落ちるわけで。
だから、画質が悪くなるのです
だから、画質が悪くなるのです
分かりにくいんでサンプル動画で説明
高速区間は4倍の速さで映像が動きます
従って、時間当たりの映像変化も4倍。
ビットレートは通常区間の4倍必要になります
(フレームレートの関係で本当はもう少し低くなるけど)
高速区間は4倍の速さで映像が動きます
従って、時間当たりの映像変化も4倍。
ビットレートは通常区間の4倍必要になります
(フレームレートの関係で本当はもう少し低くなるけど)
- 高速区間は低速区間の4倍のビットレート
- 全体の平均は200kbps
- 高速区間は全体の20%
としてビットレート分布を計算してみましょう。
してみました。
高速区間の平均ビットレートは500kbps
低速区間は125kbps。
低速区間は指定したビットレートの6割くらいでエンコードされちゃう事に!
高速区間の平均ビットレートは500kbps
低速区間は125kbps。
低速区間は指定したビットレートの6割くらいでエンコードされちゃう事に!
VBRによって、圧縮時にビットレートが偏ってしまうのが原因。
だから、もう少し均等にビットレートが分布するようにすれば
この問題は解決できそう
だから、もう少し均等にビットレートが分布するようにすれば
この問題は解決できそう
そんなわけで、今回のテーマは
「可変ビットレートを制御する」。
いったんまとめ入ります。
「可変ビットレートを制御する」。
いったんまとめ入ります。
ここまでのまとめ
- 高速区間があると、ビットレートを高速区間に持っていかれてしまう
- そのため、通常速度区間のビットレートが下がり、画質が落ちる
- 高速区間にビットレートがあまり偏らないようにすればこれは解消できるはず
03.Variability
可変ビットレートの制御は、Advancedタブの
「Two Pass Section Datarate」で行ないます
「Two Pass Section Datarate」で行ないます
まずVariability
VP6 codecの添付ドキュメントの説明を意訳します
VP6 codecの添付ドキュメントの説明を意訳します
Variability(変動性) 変動性の量を決めます。 0を指定すると固定ビットレート(CBR)になります。 100を指定すると、変動性の大きなファイルになります、 このとき、ビットレートはエンコードする区間の難易度に比例するように割り当てられます
どっかのアホの文章と違って極めて明快ですね
「区間」は、キーフレームとキーフレームの間の事を指すのだと思います
区間ごとの平均にどの程度の格差を許すのかがVariability。
「区間」は、キーフレームとキーフレームの間の事を指すのだと思います
区間ごとの平均にどの程度の格差を許すのかがVariability。
で、試してみました
上から順に、Variability90、70(初期値)、20
一番下は、標準速度区間のみエンコード(Var70)した結果です
下に行くほど、可変度合いが低くなっています
まずは標準区間
上から順に、Variability90、70(初期値)、20
一番下は、標準速度区間のみエンコード(Var70)した結果です
下に行くほど、可変度合いが低くなっています
まずは標準区間
Fig.2
上3枚は下に行くほど画質がいいですね
高速区間にビットレートを食われにくくなっているからです
では、高速区間はどうなってるんでしょう?
同じシーンの、高速部分です
高速区間にビットレートを食われにくくなっているからです
では、高速区間はどうなってるんでしょう?
同じシーンの、高速部分です
fig3
理屈の上では、逆に下ほど画質が悪くなるはずですが
イマイチよく分かりませんね
イマイチよく分かりませんね
高速再生なんでボケたのかな
逆にいえば、高速区間はボケてても問題ない
ビットレートを大きく割く意味は無い、って事になりますね
逆にいえば、高速区間はボケてても問題ない
ビットレートを大きく割く意味は無い、って事になりますね
最後に、いちばん簡単そうな区間
動画の末尾のロゴを比較します(標準速度部分)
動画の末尾のロゴを比較します(標準速度部分)
fig4
Variabilityを下げると
この区間に割かれるビットレートが上がって綺麗になるわけですね
上げると、難しい区間にビットが移動するので画質が落ちるわけです
この区間に割かれるビットレートが上がって綺麗になるわけですね
上げると、難しい区間にビットが移動するので画質が落ちるわけです
ここまでのまとめ
- Variabilityは、ビットレートの変動の大きさを決める
- 小さくするとCBRに近づき、大きくすると自由に変動する
- 大きすぎると動きの速い部分にビットレートを奪われ、その他の部分の画質が落ちる
04.Min/Max Section
Variabilityのすぐ下の項目です
まずはドキュメントを意訳してみます
まずはドキュメントを意訳してみます
Min Section(最小区間) 区間に割り当てられる最小のビットレートを指定します どんなにその区間が圧縮しやすかろうと、この値が最小になります この値は、難しい区間が簡単な区間からビットを過剰に「盗む」ことを防ぐために使われます
Max Section.(最大区間) ストリーミングできる最大のビットレートを指定します エンコーダーが割り当てる最大のビットレートになります その区間がどんなに難しかろうと、この値を上回る事はありません
Minを高くするのが、今回やりたい事に近そうです
一方、Maxを低くする事で高速区間を自重させるのも有効そう
両方試してみました。まずは標準区間。
一方、Maxを低くする事で高速区間を自重させるのも有効そう
両方試してみました。まずは標準区間。
fig5
これは割と動きの鈍いシーンです。文字が出てるしね。
Maxを下げると、高速部分でビットレートが落ちる分、他にビットが回ります
だからここの画質は微妙に上がるわけです
Maxを下げると、高速部分でビットレートが落ちる分、他にビットが回ります
だからここの画質は微妙に上がるわけです
Minを上げた時には画質が大きく上がっています
「盗まれ」なかった分、ビットレートが高くなっているわけです
「盗まれ」なかった分、ビットレートが高くなっているわけです
ロゴ表示。
ここは8秒間動きが全く無いので、疑いようも無く難易度最低区間でしょう。
ここは8秒間動きが全く無いので、疑いようも無く難易度最低区間でしょう。
fig6
うん、予想通り
Minを上げると、無闇にビットをここに割く事になるから綺麗になるんですね
Minを上げると、無闇にビットをここに割く事になるから綺麗になるんですね
この画面全体を、最高に高画質のjpeg画像にしたとしても50KB程度。
ここは再生時間で8秒程のシーンなので、50k"b"ps位で超高画質になるはず
200kbpsの90%、180kbpsは明らかにこれ以上で、だから超綺麗。
ここは再生時間で8秒程のシーンなので、50k"b"ps位で超高画質になるはず
200kbpsの90%、180kbpsは明らかにこれ以上で、だから超綺麗。
ここまでのまとめ
- MaxとMinの値で、ビットレートの最大値と最小値を規定できる
- 最大値を下げると高速な部分の画質が落ち、その分他の部分の画質が良くなる
- 最小値を上げると低速部分の画質が上がるが、他の画質は全体的に落ちる
05.総評
さて、まとめてみます
Variabilityと、Min/Maxの違いが少し分かりにくいですね
設定によるビットレート分布の変化をグラフにしてみます
横軸は…えーと、「難易度」です、映像の動きが速いほど右に来ます
縦軸は圧縮後のビットレートを示します
設定によるビットレート分布の変化をグラフにしてみます
横軸は…えーと、「難易度」です、映像の動きが速いほど右に来ます
縦軸は圧縮後のビットレートを示します
普通に圧縮すると、このように均等にグラフが移動します
Variabilityを下げると、低レート区間は高く
高レート区間は低くなります
高レート区間は低くなります
Maxを下げると、高レート区間がバッサリ切り下げられ
その分、他の区間が全体に向上します
その分、他の区間が全体に向上します
Minを上げると、低レート区間が引き上げられ
その分他の区間が下がります
その分他の区間が下がります
今回のように、4倍速以上の「なんとなく見えればいい」高速早送りの場合
Maxを低めに設定して、高速区間を丸ごと切り下げるのが有効そうです
Maxを低めに設定して、高速区間を丸ごと切り下げるのが有効そうです
静止したシーンを綺麗に見せたい場合はMinを高めに。
ただし、その分他の画質が多少落ちるので要注意。
ただし、その分他の画質が多少落ちるので要注意。
Variabilityは無難に全体に効きます
劇的な効果こそ無いが、致命的なデメリットも無い
2倍速などの低速早送りの場合、これで対処するのが無難かも。
劇的な効果こそ無いが、致命的なデメリットも無い
2倍速などの低速早送りの場合、これで対処するのが無難かも。
と、この辺で終了です。
他にも分割エンコードやCBR圧縮など、ビットレートの配分に関わる話はいくつかあります
その辺は気が向いたら、って事で…
他にも分割エンコードやCBR圧縮など、ビットレートの配分に関わる話はいくつかあります
その辺は気が向いたら、って事で…
参考資料
VP6 VFW User Guide
VP6 VFW User Guide
06.手動マルチパス
手間のかかる万能手です
早送り区間と平常区間を
別々にエンコードしてから単純にくっつけます
別々にエンコードしてから単純にくっつけます
そもそも別ファイルとしてエンコードしているので
早送り区間にビットレートを食われる、なんて事はあり得ません
早送り区間は平均で200kbps、通常区間も平均200kbps、別計算になります
早送り区間にビットレートを食われる、なんて事はあり得ません
早送り区間は平均で200kbps、通常区間も平均200kbps、別計算になります
ビットレートを含むエンコード設定を区間ごとに
手動で変えられる、極めて自由度が高い方法です
特定区間のみ高画質にしたい、なども自由自在
手動で変えられる、極めて自由度が高い方法です
特定区間のみ高画質にしたい、なども自由自在
欠点は手間がかかる事。
だから後回しにしたわけです。
だから後回しにしたわけです。
1回目のエンコードをする際、きちんとフレームレートを指定するのが連結を成功させるコツです
VirtualDubならここ。AviUtlは知らん。
VirtualDubならここ。AviUtlは知らん。
ソースのフレームレートが合っていれば
VirtualDubなら「ファイル>AVIセグメントの追加」
AviUtlなら「ファイル>追加読み込み」で連結できます
VirtualDubなら「ファイル>AVIセグメントの追加」
AviUtlなら「ファイル>追加読み込み」で連結できます
で、映像を再圧縮しない設定にして保存すれば連結完了。
一瞬で終わるはずです。
一瞬で終わるはずです。
07.CBR
CBRも、この場合は妙手。
06のように「ビットレートを一定にする」というのは、いかにもCBR的発想。
固定ビットレート圧縮について少し考えてみましょう。
固定ビットレート圧縮について少し考えてみましょう。
まず、以前の動画では適当にボカしていた1-passと2-passについての説明をします
ボカしてたのは、CBR/VBRと差分圧縮の概念がごっちゃになりやすいからなんですが
残念ながらこの辺に触れないと話が進まなくなってきた…
ボカしてたのは、CBR/VBRと差分圧縮の概念がごっちゃになりやすいからなんですが
残念ながらこの辺に触れないと話が進まなくなってきた…
1-pass目で行なうのは
- 難易度*時間、がだいたい均一になるようにキーフレームを指定する
(自動キーフレームがonの場合)
- 各区間の「難易度」=圧縮しにくさを算定する
の2点です、これはCBRでもVBRでも共通。
そして、CBR圧縮(2-pass目)は
「区間単位の」平均ビットレートが全て等しくなるように圧縮を行ないます
つまり、CBRといえど、区間内ではビットレートが上下するのです
「区間単位の」平均ビットレートが全て等しくなるように圧縮を行ないます
つまり、CBRといえど、区間内ではビットレートが上下するのです
04.Undershoot
似たようなパラメータです
ここはいじっていません、以下理由の説明です
わかんなかったら飛ばしてもOK
ここはいじっていません、以下理由の説明です
わかんなかったら飛ばしてもOK
エンコード時、VP6は
指定よりも少し低いレートでエンコードして貯金を稼いでおいて
動きの速い区間に来たらそれを食いつぶして帳尻を合わせようとします
指定よりも少し低いレートでエンコードして貯金を稼いでおいて
動きの速い区間に来たらそれを食いつぶして帳尻を合わせようとします
Undershootは、余裕があるときにどれ位のビットレートで圧縮するかを示します
低くすると、画質が低下する代わりに、変動の激しいソースでも容量オーバーしにくくなります
低くすると、画質が低下する代わりに、変動の激しいソースでも容量オーバーしにくくなります
ここの値を高くすると、非早送り区間でビットレートをあまり下げなくなります
その分、早送り区間のビットレートを下げるのならばいいのですが
ファイルサイズを目標より大きくする事で帳尻を合わせてしまいます
(というか、帳尻を合わせない、という方が適切か)
その分、早送り区間のビットレートを下げるのならばいいのですが
ファイルサイズを目標より大きくする事で帳尻を合わせてしまいます
(というか、帳尻を合わせない、という方が適切か)
よって、
「動きの激しいところに割くビットレートを下げる」
という今回の方針とは関係ないので割愛しました
指定サイズよりオーバーする事が多い人は、下げると幸せになれると思います
「動きの激しいところに割くビットレートを下げる」
という今回の方針とは関係ないので割愛しました
指定サイズよりオーバーする事が多い人は、下げると幸せになれると思います