2018年4月15日日曜日

画質と圧縮の関係

この記事では、画質と圧縮の関係について書いていきます。

動画では、どのように圧縮するかということが画質に大きく影響してきます。データ容量の制約が大きいからです。静止画や音声であれば、十分に品質が高くなるように低い圧縮率で配信すれば良いのですが、動画はそういう訳にはいきません。

ちなみに静止画、音声、動画では、現在主流となっているのは非可逆圧縮であり、圧縮したデータは、元のデータから一部が失われたものとなります。そこをなるべく人間の耳や目に感じられないようにデータを削り落とすのが重要な技術の一つです。

画質や音質というものを論じるときに最も難しい点は、最終的な画質や音質というのは、人間が主観的に評価するものであり、評価には膨大な手間と費用がかかるということです。これを主観的評価官能評価と呼びます。

また人の感じ方はそれぞれですから、Aという人が良いという音質や画質も、Bという人にとっては良くないと感じられるかもしれません。ただしデータ圧縮を論じるときは、なるべく圧縮前の品質と近いものを高く評価することになりますので、この影響は減ります。

主観的評価にはあまりにコストがかかりすぎるので、動画の品質評価には、通常は客観的評価が使われます。これは計算式によって元の画像と圧縮した画像の違いを自動的に評価するという方法です。これですら、実際にいろいろな条件で試すのは大変なので、あまり多くの実験結果が公表されているわけではありません。

さて、あまり深い解説を続けても意味不明になりますので、まずはさくっと単純化してみてみましょう。

画質 = コーデックの性能 × エンコーダーの性能 × エンコードにかけた時間 × ビットレート × 元の動画の単純さ

となります。(これはあくまで簡易式です、実際の画質とパラメータの関係は非線形になります)

元の動画の単純さという要素については、前回の記事では説明しませんでしたね。

動画は単純であればあるほど、圧縮率が高くなります。単純とはすなわち動きが少ない動画や、複雑さが少ない動画ということです。画面がのっぺりとしていて、映っているものが少なくて、それらの動きが少なければ、圧縮率が改善されます。

さらに言うと、元の動画の画質や、出力する解像度などにより、上限の画質が決まってきますので、それ以上に画質を高めようとしても無駄になるということが言えます。

これらのことを考えると、単純にビットレートだけから画質を推定できないことが分かりますね。ビットレートが高いほど良い画質とは言えないのです。

エンコーダーの性能については要注意です。同じH.264のエンコーダーと言っても、何倍も圧縮率が異なるエンコーダーが存在するからです。実績のあるx264を使うのが最も安全な選択肢でしょう。変なエンコーダーを使うと、頑張って作成した動画が低い画質になってしまいます。

x264はオープンソースのエンコーダーであり、様々な製品に統合されています。フリーソフトウェアではffmpegやHandbrakeなどで利用することができますし、有償製品であればAdobe Premiere ProやEDIUS用のプラグインも発売されています。

NVENCやIntel QSVなどのハードウェアエンコーダーは現在までの評価ではかなり画質が低いという評判ですので、避けた方が良いでしょう。日進月歩の世界なので、来年どうなってるかは不明ですが。

ビットレートの設定ですが、もしYoutubeを使っているのであれば、Youtubeの推奨エンコード設定に従えば良いかと思います。細かい設定はYoutube側で再エンコードが行われて修正されるはずですので、若干高めの画質に調整してアップロードすることがコツと思います。再エンコードのさいに若干画質が低下するからです。

XCREAMでも近いうちに推奨エンコード設定を公開する予定です。

自社で配信する場合には、ビットレートをどのように設定するかはかなり難しい問題になります。ビットレートの設定により、配信コストが大きく変わりますし、視聴者が見るための環境もそれによって決まります。光回線であっても、高画質4K動画をストリーミング配信で再生するのは難しいでしょうから、ある程度、画質を犠牲にせざるを得ません。

エンコードにかける時間は、もし時間をかけられるなら長い時間をかけるほうが良いはずなのですが、たまに問題がでます。時間をかけてエンコードを行った動画の場合、再生時にプレーヤー(デコーダー)にかかる負荷が増えますので、環境によっては再生できなくなる恐れもあります。とくにモバイル環境での再生可否については良く検証したほうがよいでしょう。

x264であればslowerが無難でしょう。

コーデックの性能ですが、保存用やアップロード用としてはH.265(HEVC)も一つの選択肢だと思います。Youtubeは推奨していないので未対応かもしれません。XCREAMではH.265によるアップロードも可能ですが、エンコーダーとの相性によっては上手く動作しない場合もあるかと思います。今後検証して結果を載せていきます。

配信用としては現在のところH.264が無難でしょう。他のコーデックは実績が少ないため再生できる環境が少なかったり、予想外のエラーがでる可能性があるので、2018年4月現在ではよほど詳しい方以外は避ける方が無難と思います。

注:
  1. そもそも画質とはなんなのか? 撮影するときのカメラやレンズの性能はどうなのか? という疑問をお持ちになる方もいるでしょうが、私は一介のソフトウェア技術者なので、残念ながらそうした疑問に対する答えは持ち合わせておりませんm(__)m
  2. コーデックやエンコーダーの比較情報サイトとしては、モスクワ大学のサイトが有名です。ただ、かなり専門的な内容になりますので、正直、正しい意味を読み解くのはかなり難しいなと感じています。
  3. 余談ですが、ハリウッド映画などでは、エンコードするときに手作業でシーンごとにエンコード設定を変えながらエンコードしているそうです。マジかよ?と思いますが、パナソニックハリウッド研究所ではそのような作業のための専用のエンコーダまで持っているそうですね。 - https://av.watch.impress.co.jp/docs/20080911/avt030.htm

0 件のコメント:

コメントを投稿