MPEG -4規格は AVC/H.264 で最新で、技術的にも素晴らしく、ほとんど芸術の領域のビデオ符号化フォーマットを定義しました。
AVC/H.264 ビデオ符号化規格は2003年に二つの団体で策定されました。ISOのMPEGとITUのVCEG です。ITUは国連の下部組織で、H.263 フォーマット(主にビデオ会議のソフトに使われています)を策定した機関です。
AVC/H.264 規格そのものの開発はJVTが開発にあたりました。これにはMPEG と VCEGの専門家が参加しています。
MPEGサイドから見ればこの規格は MPEG-4 Part 10 (ISO 14496-10)、ITU サイドではH.264 (ITU の文書番号)。 AVC(Advanced Video Coding)という "正式な" タイトルはMPEG側がAACと並べた時のバランスを考えてつけたものです。
AVC/H.264 は4つのプロファイルを定義しています:
Baseline, Main, Extended , High Profile (これらの下に〜他と同様〜それぞれ Levelによる分類があります):
DVDバックアップでは、どうやらHigh プロファイルで以下のツールを使うのが最適なようです。(2nd January 2006時点)
(MPEG-ASP? の説明もチェックして下さいGMC以外はAVC でも使えます):
AVC/H.264 では二つの、MPEG-4 ASPより先進的なビットストリーム記述方式 (マクロブロック・タイプ、モーションベクトル + 参照インデックス...)のエントロピー符号化ツールを定義しています : CAVLC(Context-Adaptive Variable Length Coding 、適応可変長符号化) と CABAC (Context-Adaptive Binary Arithmetic Coding、適応2進法符号化)。
CABACはAVC/H.264デフォルトのCAVLC (別名UVLC)よりも強力な圧縮方式で、 ビットレートをさらに約10-15% 節約できると言われています(特に高ビットレート時)。 CABACは (CAVLCも同様) ロスレスで画質低下が一切ありません。しかしエンコードとデコード速度は低下します。
※CABAC/CABLCは変換〜言葉を短く言い換えるようなもの〜なのでロスレスだが、その前の段階で量子化等による圧縮=画質劣化が入る。
※CABACはx264系(MEncoder,x264cli,x264VfW,MeGUI)のデフォルト。
※Apple-H.264(QuickTime Pro7)は明示的に指定不能。自動選択か?
プレフィルタ(例えばavisynthが行うエンコード前のフィルタリング)やポストプロセス/フィルタ (デコーダが最終出力前に行うもの)とは異なり、ループフィルタは各フレームごとのエンコードプロセス中に行われます。厳密にはエンコードの後、但し、後続フレームの為の参照フレームとして使われる前の時点です。これは特に低ビットレート時のブロックノイズ減少に効果があります。しかし、エンコードとデコードは遅くなります。
※従って、x264デブロックは切るべきではない。切ればブロックノイズのドミノ倒し。
※素材にブロックノイズがある場合はエンコーダのプレフィルタは(あれば)使ってもイイ。
※再生ソフトのデブロックフィルタ(ポストプロセスフィルタ)も切った方が良い。
※別名がいっぱいある。ループフィルタ、インループフィルタ、インループデブロッカー、x264デブロック、などなど。
※FRExtではさらに機能が拡張され、規格上はフィルムグレインすら保持できるようになったらしい。
MPEG-4 ASP (Inter4V/4MVを使った場合のみ、ブロックサイズは16x16 または 8x8 ピクセルの2種類を使い分ける)と異なり、AVC/H.264規格ではモーションサーチの精度を決めるマクロブロックを4x4 ピクセルまで下げる事を定義しています(8x4のように段階的に下げる事もできます)。ブロックサイズは映像内容に応じて適応性があり、可変です。
各マクロブロックにどの程度のブロックサイズを与えれば最も効果的か、その判断が賢いものが良いエンコーダと呼ばれるでしょう。
※x264では4x4, 4x8, 8x4, 8x8, 16x8, 8x16, 16x16、さらにi4x4とかp8x8とかなんか種類がある。
MPEG-4 ASP (直前のフレームのみを参照フレームにする)と異なり、 AVC/H.264 では複数の候補から参照フレームを選べるようにになりました。つまり、ビデオコデックはASPのようにシンプルに直前フレームを参照するか、それとももっと前のフレームを参照するか自分で決められると言う事です。このために(例えば、P-フレームが直前のI-フレームよりも前のフレームを参照できるようにするために)新しいタイプのフレームが必要になりました: IDR-フレームというのがそれです。
これはI-フレームの一種ですが、後続のフレームに自分より前のフレームを参照する事を許しません。複数参照フレームを使うとエンコード、デコード速度は低下し、カットもIDR-フレーム単位でしかできなくなります。
※MEncoderのx264は最大15フレームまで指定できるが、デコーダによってはあまり大きな値には非対応らしい。
※複数参照フレームが最も効果を発揮するのは、24fps映像を30fpsでエンコードするような場合と思われる。
※MEncoderのドキュメント類では特に、リミテッドアニメに効果有り、実写はそうでもないとしている。
※背景の前を車が通りすぎるような場面で、背景部分の参照フレームは、車に覆われる前のフレームからとった方が良いという考えに基づくので原理上は特に実写/アニメの区別は無い。
※なお、『改訂版H.264/AVC教科書(インプレス)』に拠るとH.264/AVCのPフレームは自分より後のフレームを参照する事ができる。また、Bの参照フレームは自分より前2枚 or 後ろ2枚 or 前後から各1枚の3パターンが選べる。
※この点、XvidまでのPやBの理解に基づくX264よりも「フレーム並べ替え」という全てを包含し得るAPIを持つQuickTimeのほうが将来的な拡張余地が大きい。もっとも、今のところこれはBフレームをサポートしているだけのようだ。
Weigthed Predictionを使うと参照フレームに「重要性」を付ける事が出来ます(例えば、直前の映像を(ブライトネス方向に) スケーリングできます)。これは特にフェードのある場面、暗転などで暗さが増す場合は除きますが、後続の映像が直前の映像によく似ている場合に効果的です。クロスフェードには効果がありません (例えばフェードを使った場面転換など)。
従来方式では画像の動きを予測する仕組みはあったものの、フェード画像のように画面の明るさが時間的に変化する画像を有効に予測する手段が無く、符号化画像の品質が劣化する要因となっていました(直前のフレームの明るさが基準になるので、実際のフレームの明るさとの差がノイズとなる。)。
H.264/AVC規格では、複数の参照フレームを適応的に重み付け加算した信号を予測に用いる事により、この問題を解決しています。
(複数の参照フレームに適応的に重み係数を掛けて予測に使う為、明るさが時間的に変化するフェード画像などで性能が大幅に向上する。)
※『改訂版H.264/AVC教科書(インプレス)』に拠ると、規格上はP/Bに使える。また、フェードの種類、ディゾルブ、部分的な明るさ変化であっても効果は出せるとしていた。
※実際のプログラミングでは白フェード、黒フェード、フェードイン、フェードアウト、ディゾルブなどで別の計算式を用意する必要があるようだ。
※x264は(no)weight_bのみで、これは(no)b_adaptと一緒に使うと意味が無くなる。
RDO?を使うと、エンコーダは2種類の選択肢があるような場合に最も効率の良い符号化方式を選べるようになります(例えば inter/intra decisions, motion search...などなど)
RDO?はAVC/H.264 仕様書の定義にありません。しかし、この新しいアプローチを最初に導入したのはH.264のレファレンスソフトウェア(JM)です。他のコデックもRDO?を組み込む事が出来ます。例えば、既にRDO?を装備しているXviDのVHQ モードのように。
※VC-1:別名wmv9。H.264/AVCと並んで次世代DVDに採用されている。画質的にはAVC>VC-1>ASPとされるがエンコード/デコード負荷がAVCよりは軽い。Win機の標準装備であり、北米のデジタル放送規格でも採用されている。
※SNOW:妖精現実さんがたびたび言及するlibavcodec(オープンソース)の最新コデック。MPEG系とは圧縮に対する考え方が違い、原理的にブロックノイズが発生しない。エンコード/デコード負荷はAVCよりも重い。JPEGに対するJPEG2000の地位に留まるか、パテントで煮詰めたH.264/AVCとどこまで互してゆけるか
現時点で使えるAVC/H.264コデックは、x264, Nero, Apple, MainConcept, Sorenson, Moonlight, CyberLink, VSS, mpegable, Envivio, Hdot264 (binary), DSPR, JM (reference software) (binary), ffmpeg, Philips, FastVDO, Skal, Sony,,,などなど、すでに沢山あります。
現時点では、多くの実行環境が異なるコンテナをサポートしています:
※MEncoderかx264cliで.264/.h264を吐き、mp4boxで.mp4コンテナにmuxするのが最も確実な模様。QuickTime7 Proは.264/.h264を読み込めない。
現在のエンコード実行環境は非常に遅い (大半は商業製品のプレビュー版) 。
それでも x264 と NeroDigital'の AVC エンコーダは既に良い速度と品質を提供しているようですが。とはいえ、 AVC が非常に先端的なビデオ符号化フォーマットである事に変わりはなく、古い CPUでのエンコードは非常に時間がかかるでしょう。
二つの組織 (DVDフォーラムとBlu-rayディスクアソシエーション) が現在一般的な DVD フォーマットの後継となるべく活動しています。これはいわゆる High Definition コンテンツ (現行DVDより大きな映像サイズになる)と呼ばれる物です: HD-DVD と BD-ROM
DVD フォーラムは既に MPEG-4 AVC/H.264 をHD-DVDの必須のビデオコデックとして採用しました。 Blu-rayディスクアソシエーションも、MPEG-4 AVC/H.264を対応ビデオコデックに含めるとアナウンスしています。
以上の事から、AVC/H.264 が広く使われ、サポートされる次世代ビデオフォーマットになる確率は非常に高いように思えます。DVDの中で使われている現在のMPEG-2 のように。