VQ Analyzer を提供するビデオの専門家が直伝! 3 つのケースをもとに学習するエンコードの基礎

ViCue Soft 社では、多くの開発者の役に立つビデオのエンコードに関するさまざまな専門知識を備えています。この記事をはじめとし、今後、あらゆる使用サンプルや事例をもとにエンコードについて明確に説明するためのシリーズ記事の公開を開始します。

基本事項

まずはじめに、いくつかの基本事項があります。これらは、今後の記事を明確に理解するのに役立ちます。さらなる理解を深めるために、頻繁に使用される基本的な用語もいくつか紹介します。また、ケーススタディで非常に役立つ、便利で洗練されたツールをいくつか紹介します。

それでは、始めましょう!

まず、基本事項の中でも最も基本的な事項を紹介します。

エンコードとは、何かしらの情報を新しい形式に変換する処理であり、必要なメモリ領域が大幅に少なくなると同時に、デコード時に (ほぼ) 同じ量の情報が保存されます。

ビデオのエンコードとは、ご認識の通り、ビデオデータのエンコードを示します。

エンコードには、2 種類のグループが存在します。ソース情報を 1 バイトも逃さずにエンコードを行うのがロスレス圧縮であり、エンコードおよびデコード時にいくつかの情報が失われてしまうのが非可逆圧縮です。具体的に失われるデータ量は、エンコードに使用されるパラメーターに左右されます。これについては、記事の後半で説明します。

さて、次の用語セットについて学びましょう。

コーデックとは、非圧縮データをどのようにしてエンコードされたデータに正確に変換するか、また、その逆でどのようにしてデコードするかについての一連の流れを想定しています。業界では、これらを標準と呼んでいます。例として、ITU-T H.264、ITU-T H.265、ISO/IEC 11172:Part 2 等が挙げられます。

ビデオエンコーダーは、ビデオを非圧縮形式からエンコードされた形式に変換するソフトウェアです。これは、規格に準拠したコーデックの単なる実装です。

ビデオデコーダーのソフトウェアは、エンコードされた形式のビデオを非圧縮形式のビデオデータにデコードします。

非圧縮ビデオデータは、カメラまたはその他のデバイスから取得されたデータ、または、初期の形式で格納されたまま処理が行われていないデータを指します。これは、主に YUV ファイル形式で表されます。本シリーズでは、いくつかの有名な非圧縮ビデオストリームのセットを使用します。

Y4M は、幅広く使用されているビデオ形式です。これは、通常の YUV ファイルに幅、高さ、およびファイル内の形式といった追加情報が含まれた形式です。

非圧縮ビデオストリームは、非圧縮ビデオデータを含むファイルになります。

ビデオのエレメンタリーストリーム (VES) は、ビデオエンコーダーによってエンコードされたビットストリームのファイルです。

ソフトウェア

本シリーズで使用するソフトウェアの概要について確認しましょう。

FFmpeg は、有名なオープンソースのフレームワークであり、ビデオ、オーディオ、およびその他のマルチメディアデータをエンコードおよびデコードするとともに、ストリーミング等のマルチメディア操作を実装するためにデザインされています。

VQ Analyzer は、VVC、AV1、HEVC、AVC、VP9、および MPEG-2 等の幅広いコーデックに対応し、これらのビデオストリームの詳細な分析を行うための専門的なツールです。

VQ Probe は、ビデオメトリックの計算およびビデオ品質圧縮のための専門的なツールです。

3 つのケース

基本事項はご理解いただけたかと思いますので、3 つのケースについてみていきましょう。

ここでは、以下の項目に沿って説明を行います。

  1. 非圧縮ファイルの選択
  2. 異なる設定におけるエンコード
  3. 出力の比較
  4. 結果のまとめ

説明を始める前に、使用するシステムに FFmpeg がインストールされていることをご確認ください。ターミナルで以下のコマンドを入力して確認できます。

ffmpeg

以下のようなレスポンスがあった場合、システムには FFmpeg がインストールされており、使用可能であることが分かります。

ffmpeg version 4.2.2 Copyright © 2000–2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.16)
configuration: — prefix=/usr/local/Cellar/ffmpeg/4.2.2_1 — enable-shared — enable-pthreads — enable-version3 — enable-avresample — cc=clang — host-cflags=’-I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.0.1.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.0.1.jdk/Contents/Home/include/darwin -fno-stack-check’ — host-ldflags= — enable-ffplay — enable-gnutls — enable-gpl — enable-libaom — enable-libbluray — enable-libmp3lame — enable-libopus — enable-librubberband — enable-libsnappy — enable-libtesseract — enable-libtheora — enable-libvidstab — enable-libvorbis — enable-libvpx — enable-libwebp — enable-libx264 — enable-libx265 — enable-libxvid — enable-lzma — enable-libfontconfig — enable-libfreetype — enable-frei0r — enable-libass — enable-libopencore-amrnb — enable-libopencore-amrwb — enable-libopenjpeg — enable-librtmp — enable-libspeex — enable-libsoxr — enable-videotoolbox — disable-libjack — disable-indev=jack
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]… {[outfile options] outfile}…

これで 1 つ目の項目を説明するための準備ができました。

非圧縮ファイルの選択

前述にもあります通り、非圧縮データのストレージは多数あります。この記事では、こちらのサイトとここから利用可能なファイルトラクターを使用します。

異なる設定におけるエンコード

現在、Mac に FFmpeg がインストールされています。インストールが完了していない場合、ホームページの手順に沿ってインストールを行ってください。

出力ビデオを保存するためのフォルダーに移動します。ここでは ~/streams/raw/ に非圧縮ビデオファイルを格納しますが、実際には任意のディレクトリーを指定してください。

ffmpeg -i ~/streams/raw/tractor_1080p25.y4m -c:v libx264 -b:v 100k -frames 300 tractor_1080p25_encoded_100kbps.h264

以下は、ステップごとのガイドになります。

ffmpeg は、ビデオのエンコードに使用するプログラムを指定します。

-i input/tractor_1080p25.y4m は、入力ファイルを指定します。ここでは、非圧縮ビデオになります。

-c:v libx264 は、H.264 (通称 AVC) コーデックの実装であるビデオエンコーダー libx264 を使用してエンコードすることを意味します。

-b:v 100k: は、この記事で最も重要な要素になります。このパラメーターは、エンコーダーを目的のビットレート (100 キロビット/秒、または 100 kbps) でエンコードするように設定します。これは、1 秒の出力ビデオを取得するために使用されるビット数を意味します。この記事の 3 つのケースでは、そのパラメーターがビデオにどのように影響するかを見ていきます。

-frames 300 は、300 フレームのみをエンコードすることを意味します。この記事では、これで十分です。一方、エンコードにかかる時間ははるかに短くなります。

tractor_1080p25_encoded_100kbps.h264 は、出力ファイル名です。ファイルのエンコードに使用する特定の設定を含めることをお勧めします。膨大な数のエンコードされたファイルがある場合、それぞれのエンコードされたファイルの特性を簡単に理解できます。

早速 3 つの異なるケースのエンコードを始めましょう。

出力の比較

ケース 1: 低いビットレート (100 kbps) でのエンコード

ffmpeg -i input/tractor_1080p25.y4m -c:v libx264 -b:v 100k -frames 300 tractor_1080p25_encoded_100kbps.h264

ログ出力の例を紹介します。この記事における後続のすべてのエンコーディングは非常によく似ています。

ffmpeg version 4.2.2 Copyright © 2000–2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.16)
configuration: — prefix=/usr/local/Cellar/ffmpeg/4.2.2_1 — enable-shared — enable-pthreads — enable-version3 — enable-avresample — cc=clang — host-cflags=’-I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.0.1.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.0.1.jdk/Contents/Home/include/darwin -fno-stack-check’ — host-ldflags= — enable-ffplay — enable-gnutls — enable-gpl — enable-libaom — enable-libbluray — enable-libmp3lame — enable-libopus — enable-librubberband — enable-libsnappy — enable-libtesseract — enable-libtheora — enable-libvidstab — enable-libvorbis — enable-libvpx — enable-libwebp — enable-libx264 — enable-libx265 — enable-libxvid — enable-lzma — enable-libfontconfig — enable-libfreetype — enable-frei0r — enable-libass — enable-libopencore-amrnb — enable-libopencore-amrwb — enable-libopenjpeg — enable-librtmp — enable-libspeex — enable-libsoxr — enable-videotoolbox — disable-libjack — disable-indev=jack
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Input #0, yuv4mpegpipe, from ‘/Users/dipaolo/streams/raw/tractor_1080p25.y4m’:
Duration: 00:00:27.60, start: 0.000000, bitrate: 622081 kb/s
Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p(progressive), 1920x1080, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x7fc268008e00] using SAR=1/1
[libx264 @ 0x7fc268008e00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x7fc268008e00] profile High, level 4.0
Output #0, h264, to ‘tractor_1080p25_encoded_100kbps.h264’:
Metadata:
encoder : Lavf58.29.100
Stream #0:0: Video: h264 (libx264), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1–1, 100 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc58.54.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/100000 buffer size: 0 vbv_delay: -1
frame= 300 fps= 82 q=-1.0 Lsize= 175kB time=00:00:11.92 bitrate= 120.0kbits/s speed=3.27x
video:175kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
[libx264 @ 0x7fc268008e00] frame I:2 Avg QP:50.99 size: 5304
[libx264 @ 0x7fc268008e00] frame P:95 Avg QP:51.00 size: 1608
[libx264 @ 0x7fc268008e00] frame B:203 Avg QP:51.00 size: 76
[libx264 @ 0x7fc268008e00] consecutive B-frames: 1.3% 15.3% 30.0% 53.3%
[libx264 @ 0x7fc268008e00] mb I I16..4: 65.9% 34.1% 0.0%
[libx264 @ 0x7fc268008e00] mb P I16..4: 6.1% 0.2% 0.0% P16..4: 7.6% 0.2% 3.0% 0.0% 0.0% skip:82.9%
[libx264 @ 0x7fc268008e00] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 0.1% 0.0% 0.0% direct: 0.0% skip:99.9% L0: 8.0% L1:92.0% BI: 0.0%
[libx264 @ 0x7fc268008e00] final ratefactor: 64.30
[libx264 @ 0x7fc268008e00] 8x8 transform intra:10.7% inter:100.0%
[libx264 @ 0x7fc268008e00] coded y,uvDC,uvAC intra: 1.0% 6.5% 0.0% inter: 0.0% 0.0% 0.0%
[libx264 @ 0x7fc268008e00] i16 v,h,dc,p: 89% 9% 1% 0%
[libx264 @ 0x7fc268008e00] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 12% 12% 68% 1% 2% 1% 2% 1% 1%
[libx264 @ 0x7fc268008e00] i8c dc,h,v,p: 100% 0% 0% 0%
[libx264 @ 0x7fc268008e00] Weighted P-Frames: Y:1.1% UV:1.1%
[libx264 @ 0x7fc268008e00] ref P L0: 72.9% 0.4% 17.5% 9.2% 0.1%
[libx264 @ 0x7fc268008e00] ref B L0: 71.9% 3.8% 24.4%
[libx264 @ 0x7fc268008e00] ref B L1: 89.3% 10.7%
[libx264 @ 0x7fc268008e00] kb/s:119.19

ターミナルで上記のようなメッセージが表示された場合、ファイルのエンコードに成功したことを意味します。

この結果、tractor_1080p25_encoded_100kbps.h264 というファイルが新しく作成されました。使用時のために保存します。

ケース 2: 高いビットレート (1000 kbps/1 Mbps) でのエンコード

ffmpeg -i ~/streams/raw/tractor_1080p25.y4m -c:v libx264 -b:v 1000k -frames 300 tractor_1080p25_encoded_1000kbps_300frames.h264

ここでの出力ファイルも後で使用できるよう忘れずに保存します。

ケース 3: 3 つのケースで最も高いビットレート (10000 kbps/10 Mbps) でのエンコード

ffmpeg -i ~/streams/raw/tractor_1080p25.y4m -c:v libx264 -b:v 10000k -frames 300 tractor_1080p25_encoded_10000kbps_300frames.h264

これで異なるビットレートでエンコードされた 3 つのファイルが作成されました。

  • tractor_1080p25_encoded_100kbps_300frames.h264
  • tractor_1080p25_encoded_1000kbps_300frames.h264
  • tractor_1080p25_encoded_10000kbps_300frames.h264

出力の比較

すべてのファイルがエンコードされたら、これらの表示や違いについて確認してみましょう。

2 つのビデオファイルを視覚的に比較するための包括的なツールである VQ Probe の使用を推奨します。

最初の 2 つのファイルから始めましょう。これらのファイルを最初の非圧縮ビデオファイル (通称、参照ビデオファイル) とともに開きます。

[su_note note_color=”#e7e7e7″]注意: ここでは、ツールの使用方法に関する説明は省略します。詳細なガイドとヒントについては、こちらの記事 (英語) を参照してください。[/su_note]

 図 1: tractor_1080p25_encoded_100kbps_300frames.h264 vs. tractor_1080p25_encoded_1000kbps_300frames.h264

図 2: tractor_1080p25_encoded_100kbps_300frames.h264 vs. tractor_1080p25_encoded_1000kbps_300frames.h264 (フレーム #46)

図 3: tractor_1080p25_encoded_100kbps_300frames.h264 vs. tractor_1080p25_encoded_1000kbps_300frames.h264 (フレーム #123)

アプリケーション・ウィンドウの右側 (1000 kbps でエンコードされたファイル) の品質が左側 (100 kbps) よりもはるかに優れていることは明らかです。VQ Probe 内で 2 つのファイルを同時に再生することで、視覚的に品質の違いを確認できます。

このようなビデオファイルの視覚的な比較を人間の目で行った場合、主観的です。この種の比較を使用する、ビデオ品質を計算するためのいくつかの形式化された方法とアプローチがあります。これらは、主観的品質指標と呼ばれます。

その一方、客観的品質指標も存在します。 これらの指標は数学的アルゴリズムに基づいており、人間の目からのインプットを必要としません。

最も使用されている客観的品質指標の 1 つである PSNR 指標をご覧ください。さまざまな種類の指標を取得するための便利なツールとして、もう一度 VQ Probe を使用します。

PSNR 指標について、100 kbps と 1000 kbps のそれぞれの結果は次のとおりです。

図 4: PSNR – 100 kbps でエンコードされたファイルと 1000 kbps でエンコードされたファイルの Y 指標

図 5: 100 kbps でエンコードされたファイルと 1000 kbps でエンコードされたファイルの VMAF 指標

100 kbps のビデオを表す青い線が表示されます。緑の線は、1000 kbps ファイルを示しています。これらの間の大きな違いにお気づきかとは思いますが、こちらについては後程説明します。まずは、数字を見てみましょう。

数値は、青と緑の曲線でそれぞれ 25.19 dB と 34.8 dB で始まります。

[su_note note_color=”#e7e7e7″]注意: 主観的品質は dB (デシベル) で測定され、0 (最低の品質) から 100 (ビデオ品質の完全一致) の範囲で判断されます。ここからは、品質指標値の後に dB の書き込みをスキップできます。[/su_note]

25.19 dB は非常に低いレベルであり、実際の使用には適していません。この数値は、視覚的な品質に対する最初の印象を裏付けています。34.8 dB は、一般的に許容できる品質を意味します。

ここで、なぜ一般的には許容できるのかについて明確にする必要があります。これは、高品質に対応する数値が、ビデオ解像度、ビデオのコンテンツ、特定のエンコード用パラメータ等のさまざまな要因によって異なる場合があるためになります。これらのケースについては、後のシリーズで取り上げます。

それでは、PSNR 数値に戻ります。PSNR 値は、ビデオの中で変化することが分かります。この値は上下し、その後再び上昇します。100 kpbs ファイルと 1000 kbps ファイルの平均数値は、それぞれ約 22 dB と30 dB です。

緑と青の線の違いについては、L/R Quality Diff というタブを見てみましょう。

図 6: PSNR 値の違い – 100 kbps でエンコードされたファイルと 1000 kbps でエンコードされたファイルの Y 指標

ここでは、すべての単一フレームにおける PSNR 値の正確な違いを確認できます。最大の差は 250 フレーム目に配置されて値が 13.85 dB に等しいのに対し、19 フレーム目で 3.14 dB に等しい最小の差を見つけることができます。

平均的に、1000 kbps のビットレートでエンコードされたファイルは、約 8 dB の 100 kbps でエンコードされたファイルよりも優れていると言えます。実際、これは 1000 kbps でエンコードされたファイルでは非常に良い結果です。

次の 2 つのペア (1 Mbps と10 Mbps) を同じように比較してみましょう。先程説明を行ったため、この比較では短いコメントともに結果をお見せします。

図 7: tractor_1080p25_encoded_1000kbps_300frames.h264 vs. tractor_1080p25_encoded_10000kbps_300frames.h264

図 8: tractor_1080p25_encoded_1000kbps_300frames.h264 vs. tractor_1080p25_encoded_10000kbps_300frames.h264 (フレーム #88)

PSNR 値は以下の通りです。

図 9: PSNR – 1000 kbps でエンコードされたファイルと 10000 kbps でエンコードされたファイルの Y 指標

VMAF 値は以下の通りです。

図 10: 1000 kbps でエンコードされたファイルと 10000 kbps でエンコードされたファイルの VMAF 指標

前述にもあります通り、1000 kbps の場合は約 30 dB、ビットレートが最も高いファイルの場合は 40 dBです。

PSNR 値の違いは以下の通りです。

図 11: PSNR 値の違い – 1000 kbps でエンコードされたファイルと 10000 kbps でエンコードされたファイルの Y 指標

1 Mbps ファイルと 10 Mbps ファイルの差は約 10 dB です。これは実際には大きな違いです。1 Mbps と 10 Mbps の視覚的な違いは確かに存在しますが、これまで 100 kbps と 1 Mbps で見られたほど大きくはありません。

ちなみに、100 kbps と 10000 kbps の視覚的な違いは次のとおりです。100 倍の違いがあります。

図 12: tractor_1080p25_encoded_100kbps_300frames.h264 vs. tractor_1080p25_encoded_10000kbps_300frames.h264

結果のまとめ

以下のテーブルですべての結果を紹介します。

上記の結果から、以下のことが分かります。

1. 3 つのエンコードされたファイルの視覚的主観品質は次のとおりです。最初のファイルは、100 kbps でエンコードされており、品質が非常に悪いように見えました。客観的品質の値は 22 dB であることからも、非常に低いことが確認できます。1 Mbps のビットレートでエンコードされた次のファイルは、許容できる品質ではありますが、あまり良いものではありません。30 dB という測定品質は、視覚的に見た結果を反映しています。最後にエンコードされたファイルは、予想どおり最高の品質を示しています。主観的指標と客観的指標の両方が同じであることが分かります。

2. 10 倍高いビットレートでは、約 35% の品質向上しか得られません。この数値は正常でしょうか? エンコーディングについては、今後の記事でさらに詳しく説明します。


この記事は、ViCue Soft 社の Technology Blog に公開されている「3 Cases from a Video Expert: Encoding BasicsVQ Analyzer Update: V5.0 Launch」の日本語参考訳です。

タイトルとURLをコピーしました