Skip to content
uupaa edited this page Sep 12, 2018 · 6 revisions

このエントリでは、主に HLS から MPEG-2 TS を取り出し、H.264 と AAC に分解するまでの用語をカバーしています。 地デジや MPEG-2 PS に関する記述はありません。

MPEG-2 の説明も参照してください。

MPEG-4 part 10 (MPEG-4 AVC/H264)

MPEG-4 part 10 の規格書は、ITU-T から無料でダウンロードできます (ISO/IEC では同じものを有料で販売しています)。

MPEG-4 はその成り立ちから、MPEG-2 や MPEG-1 で定義された用語が度々登場する事になります。

MPEG-4

  • ByteStream ByteStream format (ByteStream format)

    • MPEG-4 part 10 AVC/H264 の規格書の Annex B で定義されているバイトデータのフォーマットで、連続する StartCode + EBSP で構成されるバイトデータです
    • MPEG-2 TS に搭載されたH.264データを元にMP4ファイルを生成するには、以下の手順でデータ変換を行う必要があります
      1. fetch M3U8 file
      2. parse M3U8 file
      3. fetch *.ts file
      4. parse TSPacket
      5. parse PESPacket
      6. parse ByteStream
      7. parse NAL file format
      8. parse AUD, SPS, PPS, SEI, IDR, ...
      9. build AccessUnit
      10. Mux
      11. build mp4 file
  • VCL (Video Coding Layer)

    • ビデオ符号化レイヤ, 動画符号化を扱う最初のレイヤーになます
  • NAL (Network Abstraction Layer)

    • 符号化した情報を伝送/蓄積を行う VCL の次のレイヤーになります
    • 1個以上の NAL Unit が連続している Stream です。
    • | NALUnit | NALUnit | ...
  • VCL-NALUnit

    • 圧縮されたスライスデータ(映像データ)そのものを指します
    • nal_unit_type の値は 1 〜 5 になります
  • Non-VCL-NALUnit

    • 映像データではないメタデータ(補助的な情報)です。AUD, SPS, PPS, SEI などが Non-VCL-NALUnit に該当します
    • nal_unit_type の値が 6以上になります
  • NALUnit (Network Abstraction Layer Unit)

    • NALUnit はAVC の世界におけるデータの基本的な単位で NALHeaderRBSP で構成されます
      • NALUnit = NALUnitHeader + EBSP
    • NALUnit はバイト単位でアライメントされています
    • NALUnit は動画や音声データを含む VCL-NALUnit と、それらを含まない Non-VCL-NALUnit の2つに大きく分類できます
      • VCL-NALUnit かどうかは、nal_unit_type で判別できます
    • NALUnit には2つの Stream(バイナリデータフォーマット) があります
      1. ByteStream (NAL Uints in Byte-stream Format)( StartCode + NALUnitHeader + EBSP )
      • このフォーマットでは NALUnit の長さは明確に格納されていません。先頭からStartCode(00 00 01)を探すことでNALUnitの区切りとバイトサイズを知ることができます
      • StartCode は 00 00 01 です。先頭に複数の余計な 00 が含まれていてもOKです
        • 00 00 01 の他に 00 00 00 0100 00 00 00 01 なども合法です
        • 他の Stream に変換する場合は、EP3B( 00 00 03 0x ) を 00 00 0x にデコードする必要があります
      • MPEG-2 TS に格納されているバイトデータはこのフォーマットです
      • ffmpeg -o で拡張子を .264 にした場合に生成される生データもこのフォーマットです
      1. NAL file format ( NALUnitSize + NALUnitHeader + EBSP )
      • mp4 の mdat box に格納されているバイトデータはこちらのフォーマットです
      • NALUnitSize には NALUnit のバイト数がビックエンディアンで格納されています
    • MPEG-4 part 10 AVC の規格書では、NALUnitから -> NALUnitHeader と RBSP を取り出す擬似コードが nal_unit 関数として説明されています
      • emulation_prevention_three_byte も nal_unit 関数の中でデコードしています
  • StartCode

    • StartCode = 00(0個以上) + 00 00 01
    • 00 00 01 から構成されるバイト列です。先頭に余計な00が複数存在する場合があります
  • NALUnitSize, NumBytesInNALunit

    • NALUnit のサイズを示す情報です
    • NALUnit のサイズが 4 byte なら | 00 00 00 04 | NALUnit | になります
    • 通常 4 byte ですが 1 byte または 2 byte のケースもありえます
      • AVCDecoderConfigurationRecord.lengthSizeMinusOne + 1 が2 なら NALUnitSize のサイズは 2 になります
  • NALUnitHeader, NALHeader

    • NALUnit の先頭1byteです。先頭は 0b0 で始まります。NALUnit の内容をデコードするための情報が含まれています

    • NALUnit の内容を知るには、先頭1byte (NALUnitHeader) を読み込み, 0(固定値) + nal_ref_idc (2 bit) + nal_unit_type (5 bit) に分解します

      |ABBCCCCC|    bits field
      |~       | -> 1    always zero `0`
      | ~~     | -> 2    nal_ref_idc (参照ピクチャとなるスライスが含まれているかどうか)
      |   ~~~~~| -> 5    nal_unit_type (NAL Unit の type を示す識別子)
      
    • nal_ref_idc (2 bit)

      • 参照ピクチャとなるスライスが含まれているかどうかを示します
      • nal_ref_idc00 ならこのNALUnitがピクチャ予測のために参照されない事を意味しています(つまり一度読んだら速やかに廃棄可能なNALUnitという事になります)。
      • 00 以外ならその AccessUnit には SPSやPPSやスライスデータが含まれており、他のNALUnitやピクチャ予測から参照されるデータを含んでいるという意味になります(つまり読み込んだ後にすぐさま廃棄できません)
    • nal_unit_type (5 bit)

      • NALUnit の type を示す識別子です
      • nal_unit_type が 5 ならその NALUnit は IDR ピクチャです。VCL-NALUnit です
      • nal_unit_type が 9 ならその NALUnit は AUD です。AccessUnit の切れ目を意味します。Non-VCL-NALUnit です
      • nal_unit_type が 7 ならその NALUnit は SPS です。AccessUnit 全体に対するメタ情報が格納されています。Non-VCL-NALUnit です
      • nal_unit_type が 8 ならその NALUnit は PPS です。ピクチャに対するメタ情報が格納されています。Non-VCL-NALUnit です
      nal_unit_type Subject
      0 未定義
      1 IDR 以外のピクチャの一部(スライス)
      2 データパーティショニングAで符号化されたスライス
      3 データパーティショニングBで符号化されたスライス
      4 データパーティショニングCで符号化されたスライス
      5 IDR ピクチャ
      6 SEI
      7 SPS
      8 PPS
      9 AU デリミタ
      10 End of Sequence
      11 End of Stream
      12 Filler Data (フォーマットを整えるために挿入される詰め物。ダミーデータ)
      13 SPS拡張, FRExt で使用
      14 .. 18 Reserved
      19 補助スライス, FRExt で使用
      20 .. 23 Reserved
      24 .. 31 未定義
  • AccessUnit AU

    • AccessUnit 1枚のピクチャ(フレーム)を生成するために必要な NALUnit の集まりの事です。
    • AccessUnit は AUD(Access Unit Delimiter) を検索することで見つける事ができます。
    +-----+-----+-----+-----+---------++-----+-----------++-----+-----------+
    | AUD | SPS | PPS | SEI | IDR ... || AUD | ...       || AUD | ...       |
    +-----+-----+-----+-----+---------++-----+-----------++-----+-----------+
    <---------- Access Unit ----------><-- Access Unit --><-- Access Unit -->
    
  • EBSP (Encapsulate Byte Sequence Payload), EP3B (Emulation Prevention Three byte), emulation_prevention_three_byte

    • EP3B (00 00 03 0x) を含む(かもしれない)バイトデータです。

    • StartCode の 00 00 01 と類似したビットパターンが ByteStream 内に存在すると適切にパースができなくなってしまいます。

    • このような状態を避けるため、ByteStream(EBSP) においては以下の特定のパターンのバイト列が、別のバイト列に置換した状態で格納されています。

    • EBSP を RBSP に変換するには 00 00 03 0x00 00 0x にデコードする必要があります。x には 0〜3 の値が入ります

      EBSP RBSP
      00 00 03 00 00 00 00
      00 00 03 01 00 00 01
      00 00 03 02 00 00 02
      00 00 03 03 00 00 03
  • RBSP (Raw Byte Sequence Payload), Syntax Element

    • NALUnitHeader + RBSP という文脈で説明されている場合は、NALUnit の 2byte目以降のデータです
    • EP3B を含まないバイトデータです
    • RBSP の末尾はバイトアライメント(8bit埋め)が行われます。1byte に満たない部分には RBSP_trailng_bits を付与して byte 単位にします
      • RBSPのデータが3bit余る場合は、xxx + 1 + 0000 が RBSPの末尾に埋め込まれ xxx10000 になります
      • デコードは、最後のByteをLSBからMSBの方向に見ていきます(右から左に見ていきます)。1 が現れたらそこまでが padding データです
  • RBSP_trailng_bits

    • RBSP の末尾に配置する詰め物です
    • 先頭が 1 で、それ以降は 0 のビット列です
      • 7bit の隙間がある場合は、0b1000000 で埋めます
      • 4bit の隙間がある場合は、0b1000 で埋めます
      • 2bit の隙間がある場合は、0b10 で埋めます
      • 1bit の隙間がある場合は、0b1 で埋めます
  • SODB (string of data bits)

    • NALUnit に含まれる raw バイナリデータです。
    • バイナリデータを Bit単位で考えたものが SODBで、Byte単位で考えたものが RBSP です。
  • Stream, MPEG Stream

    • MPEG における Stream とは バイナリデータフォーマットの事です、 MPEG では様々なフォーマットのバイナリデータを扱うためフォーマットを識別するための名前がついています
    • ES (Elementary Stream)
      • 生オーディオデータやビデオデータは ES と呼ばれます
      • ES を Mux して得られたデータは System Stream (MPEG1) や Program Stream (MPEG-2 PS)と呼ばれます
    • PES (Packetized Elementary Stream)
      • ES をネットワークに流しやすいように分割しパケット化したものを PES と呼びます
      • PES には再生時刻に関する情報(PCR, OPCR)を含む事ができます
        • PCR, OPCR は 27MHz(27 * 1000 * 1000) で駆動するクロックです。現実世界の1秒は PCR では 27000000 になります
        • デコーダは時刻情報が含まれている場合に、これらを使って音声と動画を同期させる事が可能になります
      • 用途に応じて TS と PS があります
    • TS (Transport Stream)
      • ネットワークに流しやすいようにパケット化されたデータは Transport Stream (MPEG-2 TS)と呼ばれます
    • PS (Program Stream)
      • HDD,テープ,円盤メディアなどに保存しやすい形でパケット化されたデータは Program Stream (MPEG-2 PS)と呼ばれます
      • PS と PS は lossless (無劣化)で相互に変換することが可能です。
    • NALUnit in Byte Stream Format (H264 Byte stream format)
      • StartCode(00 00 00 01 や 00 00 01) を区切りとする NAL Unit のバイナリストリームです
      • | 00 00 00 01 | NALUnit | 00 00 01 | NALUnt | ...
    • NAL, NAL Stream
      • 1個以上の NAL Unit が連続している Stream です。
      • | NALUnitSize | NALUnit | NALUnitSize | NALUnit | ...
  • marker_bit

    • ビット列がスタートコード(0x000001等)と一致してしまうことを避けるために ガードコードとしてmarker_bitが所々挿入されています。 marker_bit 自体は情報を持っていないため読み飛ばします。
  • AU (Access Unit)

    • 1つのピクチャを構成するために必要な情報を収めたNALUnitの集合です
    • 一般的な AU は連続したNALUnit(AUD, SPS, PPS, SEI, IDR...) から構成されます
    • AU に SPS や PPS が含まれない場合は、1つ前の SPS や PPS をコピーして使用する必要があるようです TODO: 要確認 → 確認済み。最後のSPSやPPSは省略された場合に備え、保持しておく必要があります
  • AUD (Access unit delimiter)(AU Delimiter)

    • アクセスユニットの先頭を示します
    • アクセスユニットに含まれるスライスの種類が格納されています
    • nal_unit_type は 9 です
    • 00 00 01 09 F0 から構成されるバイト列です
  • End of Sequence

    • シーケンスの終端を示します
  • End of Stream

    • 映像/音声ストリーム全体の終端を示します
  • Filler Data

    • データ量が少なすぎて規格の仕様を満たせない場合に挿入される無意味なデータです
  • SPS (Sequence parameter set)

    • nal_unit_type は 7 です
    • 省略が可能です。省略されている場合は、それまでに現れた最後(latest)の SPS を流用します
    • AU 全体に関する重要なメタ情報が格納されています
      • seq_parameter_set_id, このSPSデータを示すユニークなIDです。PPS からはこのIDで参照されます。重要なデータです
      • profile_idc, H.264 profile です。Baseline profile は 0xE0(224) です
      • level_idc, H.264 Level です Level 30 は 0x1E(30) です
      • num_ref_frames, 参照しているフレーム数です。 TODO: 参照している? 参照されている?
      • pic_width_in_mbs_minus1, ピクチャの幅-1の値です。+1 することで幅が得られます
      • pic_height_in_map_units_minus1, ピクチャの高さ-1の値です。+1 することで高さが得られます
  • PPS (Picture parameter set)

    • nal_unit_type は 8 です
    • 省略が可能です。省略されている場合は、それまでに現れた最後(latest)の PPS を流用します
    • ピクチャ全体に関するパラメタやメタ情報が格納されています
      • pic_parameter_set_id, このPPSデータを示すユニークなIDです。slice からはこのIDで参照されます。重要なデータです
      • seq_parameter_set_id, このPPSデータと関連する SPS のIDです。
      • entropy_coding_mode_flag, CAVLC or CABAC の情報です。Baseline Profileでは CAVLCが、MainProfile では CABAC が使用されます
  • SEI (Supplemental enhancement information)

    • nal_unit_type は 6 です
    • SEI は符号化には必要がない、表示やバッファ管理上有用な情報を提供する NALUnit です
      • Recovery point, シーク後に表示を復帰するための情報などが格納されています
    • SEI NALUnit は、複数のSEI Message を含んでいる事があります
    • ユーザデータなども SEI に格納することができます
      • ffmpeg が生成するエンコード時に使用した設定情報が User Date に格納されていたりします
  • IDR picture (Instantaneous Decoding Refresh picture), Multiple Reference Frames

    • それ単体で成立する画像の事です。Iフレームとも呼ばれます。
    • 先頭のフレームは必ずIフレームになります。定期的にIフレームが送られることで、転送エラー発生時にエラーから回復することができます。
    • 比較的データサイズが大きいため、複数のパケットに分割される事があります
    • IDRはIフレーム(または SIフレーム)の一種です。通常のIフレートの動作に加え、後続のフレームがIDRフレームよりも前方を参照する事を禁止する効果があります。
      • ビデオシーケンスにおける最初のピクチャは、必ずIDRピクチャになります。Iフレームが最初に来ない場合は動画として成立しません
      • いわゆるキーフレームになります。プレイヤーなどのシーク動作はIDR単位で行われます
      • H.264 の前身となる MPEG-4 ASP では、参照できるフレームは直前のフレームのみでしたが、H.264 ではその制限がなくなり 複数のフレームを参照したり離れたフレームを参照できる可能になりました。 このことから直前のIフレームやPフレームを飛び越え、更に前のフレームも参照可能になりましたが、 これはデコーダにとっては傍迷惑な仕様であり、このような問題を解決するために、無軌道な前方の参照を禁止する新しいIフレーム = IDR が必要になりました。
    • IDR picture は他のピクチャやスライスを参照する必要がないため POC や frame 番号は 0 にリセットされます
    • 通常は IDR picture を 0.5 〜 2秒間隔で挿入することで、意図した場所へのシークが可能なムービーを作成します
  • seq_parameter_set_id

    • PPSから参照されるSPSのIDです。0〜31の値です
  • pic_parameter_set_id

    • スライスから参照されるPPSのIDです。0〜31の値です
  • log2_max_frame_num_minus4

    • MaxFrameNum を算出するためのパラメタです。
    • MaxFrameNum は MaxFrameNum = Math.pow(2, log2_max_frame_num_minus4 + 4) で計算できます
  • MMCO5 (memory_management_control_operation equal to 5)

    • memory_management_control_operation が 5 の場合は frame_num の扱いが一部変化します

    Any coded slice NAL unit or coded slice data partition A NAL unit of the primary coded picture of the current access unit shall be different from any coded slice NAL unit or coded slice data partition A NAL unit of the primary coded picture of the previous access unit in one or more of the following ways:

    – frame_num differs in value. The value of frame_num used to test this condition is the value of frame_num that appears in the syntax of the slice header, regardless of whether that value is inferred to have been equal to 0 for subsequent use in the decoding process due to the presence of memory_management_control_operation equal to 5.

    NOTE 1 – A consequence of the above statement is that a primary coded picture having frame_num equal to 1 cannot contain a memory_management_control_operation equal to 5 unless some other condition listed below is fulfilled for the next primary coded picture that follows after it (if any).

  • slice_header

    • TODO:
    • slice_header は2段階で読み込む必要があります
    • 1段目は、
    • 2段目は、1段目から得られた SPSのIDとPPSのIDを参照しデコード処理を進めます
  • slice_id

    • スライス毎に設定されているIDです。nal_unit_type が 2 〜4 の場合に必要になります
    • 値の範囲には一定の制限があります
      • if (separate_colour_plane_flag === 0) { ... }
      • if (separate_colour_plane_flag === 1) { ... }
      • if (MbaffFrameFlag === 0) { ... }
      • if (MbaffFrameFlag === 0) { ... }
  • Baseline profile

    • I と P スライスしか利用できません
    • NALUnit の nal_unit_type には 2〜4の値(Coded slice data partition A/B/C)は登場しません
    • SPS.frame_mbs_only_flag は必ず 1 になります。
      • frame_mbs_only_flag equal to 1, it is specifies that every coded picture of the coded video sequence is a coded frame containing only frame macroblocks.

    • SPS の以下のパラメタには以下の制限があります
      • chroma_format_idc は利用しません
      • bit_depth_luma_minus8 は利用しません
      • bit_depth_chroma_minus8 は利用しません
      • qpprime_y_zero_transform_bypass_flag は利用しません
      • seq_scaling_matrix_present_flag は利用しません
    • PPS の以下のパラメタには以下の制限があります
      • weighted_pred_flag は利用しません
      • weighted_bipred_idc は利用しません
      • entropy_coding_mode_flag は利用しません
      • num_slice_groups_minus1 は 0 から 7 までの値になります
      • transform_8x8_mode_flag は利用しません
      • pic_scaling_matrix_present_flag は利用しません
      • second_chroma_qp_index_offset は利用しません
    • CAVLC の以下のパラメタに制限があります(内容省略)
    • Macroblock layer の以下のパラメタに制限があります(内容省略)
    • profile_idc を 66 にし、constraint_set0_flag を 1 に constraint_set1_flag を 1 にしてください
      • つまり、profile_idc に 0x42(66) をセットし次の1byteに 0xE0(224) をセットします
  • Level

    • Level に応じたビットレートの制限があります
      • Level 3.0 は、最大フレームサイズ(MaxFS)が 1620, 最大ビットレート(MaxBR)が 10000 です
  • primary_pic_type

    • AccessUnit にどんなスライスが含まれているかを示す値です。この値を見ることで、AccessUnit の処理方針の目安を決める事ができます

    • ただし ffmpeg が生成するデータでは常に primary_pic_type = 7 になっており、この値を指標として利用することは難しい(できない)ようです

      primary_pic_type slice_type
      values that may be present in the primary coded picture
      Name of slice_type
      0 2, 7 I
      1 0, 2, 5, 7 P, I
      2 0, 1, 2, 5, 6, 7 P, B, I
      3 4, 9 SI
      4 3, 4, 8, 9 SP, SI
      5 2, 4, 7, 9 I, SI
      6 0, 2, 3, 4, 5, 7, 8, 9 P, I, SP, SI
      7 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 P, B, I, SP, SI
  • slice_type

    • AVC では 1枚のピクチャに複数のsliceが含まれています。sliceは混在が可能です。
    • slice_type が5以上なら、そのピクチャに含まれる全ての slice が同じ種類である事を意味します。
      • slice_type = 7 の場合は、そのピクチャに含まれる全ての slice が I Picture です

        slice_type Name of slice_type
        0 P (P slice)
        1 B (B slice)
        2 I (I slice)
        3 SP (SP slice)
        4 SI (SI slice)
        5 P (P slice)
        6 B (B slice)
        7 I (I slice)
        8 SP (SP slice)
        9 SI (SI slice)
  • CAVLC (Context-Adaptive Variable Length Coding)

    • コンテクスト適応型可変長符号化方式です。圧縮率はそれほど高くありません
    • Baseline profile で使用されます
  • CABAC (Context-Adaptive Binary Arithmetic Coding), UVLC

    • コンテクスト適応型2値算術符号化方式。CAVLC よりも時間はかかりますが圧縮率は10〜15%ほど高くなります
    • Main profile 以上で使用できます
  • Exp-Golomb (Exponential-Golomb coding)

    • 整数を符号化する方法の1つです。
    • 0 は 1 に、1 は 010 に符号化されます
  • MPEG圧縮データの6階層構成

    • MPEG で圧縮されたデータは6つのレイヤーで区分されています
      1. シーケンスレイヤー, GOP + SH を 1対としたパケットを処理するレイヤーです
      2. GOPレイヤー, GOP の中に含まれる複数の I/B/P ピクチャを処理するレイヤーです
      3. ピクチャレイヤー, 1枚の画像を16ライン程で上から順番に切り取ったスライスという単位で処理するレイヤーです
      4. スライスレイヤー, スライスを横方向に16ライン幅で切り取ったマクロブロックという単位で処理するレイヤーです
      5. マクロブロックレイヤー, マクロブロックを4分割したブロックや、更にYUV毎に処理するレイヤーです
      6. ブロックレイヤー(DCT処理単位), ブロックを処理するレイヤーです
  • Sequence (シーケンス)

    • 15枚程度の連続した Picture をまとめたものを Sequence と呼びます
    • Sequence は | GOP + SH | GOP + SH ... から構成されるデータ構造です
    • GOP は 15枚程度の I/B/P Pictureから構成されています
      • GOP単位で各画像の差分を抽出し、I,B,Pピクチャを作り、圧縮率を稼ぐのがMPEGの基本戦略です
    • SH はSequence Header の略です。画像の開始点はSHの切れ目からになります
    • I, B, P ピクチャは、さらに画像を横方向に切り取った slice で構成されています
  • Picture (Frame)

    • 1枚の画像(ピクチャ,フレーム)は複数のスライスから構成されています
    • I Picture, B Picture, P Picture などの種類があります
    • MPEG-2/MPEG-4 では Picture が基本の単位ですが、AVC では slice が基本単位となります
      • MPEG-2/MPEG-4 では 1 Picture が 1 Frame に相当し、Picture 毎に符号化モードが存在しましたが、 AVC では slice 単位で符号化モードが決められています。
      • AVC では 1つの Picture の中に、異なるタイプの slice を混在させる事が可能です
        • 1つの Picture の中に1種類の slice だけが存在する事を示すには、slice_type の値を 5〜9にするか、 AUD の primary_pic_type を使って明示します
  • Picture 境界(先頭のPicture)

    • AVCデータがMPEG-2 System(MPEG-2 TS や MPEG-2 PS)を経由する場合は、必ずAUDが付与されているため、 先頭のピクチャかどうかをあまり意識する必要はありません
    • AUD が存在しないバイトストリームを扱う場合は、先頭のPicture かどうかを調べる必要があります
      • 以下の条件に該当する場合は先頭のPictureです
      • frame_num が異なる
      • field_pic_flag が異なる
      • frame_num が同じだが POC (Picture Order Count) の値が異なる
      • nal_ref_idc が異なる
      • IDRピクチャで idr_pic_idc が異なる
  • Slice

    • frame_num
      • slice header の中にあります。そのsliceがどのframeに所属するかの情報です
    • I Picture (Intra Picture)
      • 他のピクチャを参照することなく画面を得られるピクチャです。最も基本的なピクチャになります
    • P Picture (Predictive Picture)
      • 1つ前のピクチャを参照することで得られるピクチャです
    • B Picture (Bi-direction predictiv Picture)
      • H.264 では、過去や未来の2枚のピクチャを参照することで得られるピクチャです
      • Baseline profile では利用できません
    • SI slice
      • SI slice はストリームの切り替えを行うための特殊なI sliceです。ffmpeg からは生成されません
    • SP slice
      • SP slice はストリームの切り替えを行うための特殊なP sliceです。ffmpeg からは生成されません
  • YUV Colour Formats

    • yuv4:2:0 などを指定できます。
    • ffmpeg で利用できる x264コーデックには yuv4:2:0 しか指定できません
  • MP4 file format version 2. ".mp4"

    • MP4 file format は ISO/IEC 14496-14:2003 で規定されています。 この規格書は、2001年に発行された ISO/IEC 14496-1:2001 を上書きするもので、 コミュニティからは MPEG-4 file format version 2 または MP4v2 と呼ばれています。
    • 拡張子が ".264" の物は MP4 コンテナに入っていない生の H.264 ビデオストリーム(moovの中身)です。
  • ISOBMFF (ISO Base Media File Format)

    • MP4Box 構造のことです
    • ISO/IEC 14496-12 で定義されています
  • VLC (Variable Length Coding)

    • ハフマン符号をベースとした可変長符号化です
  • IOD (Initial Object Descriptor)

    • 14496-14 で定義されています TODO: 詳細を記述
  • OD (Object Descriptors)

    • 14496-14 の 3.1.3 で定義されています
  • PCR (Program clock reference), OPCR (Original Program clock reference)

    • MPEG-2 TS における時刻情報です
    • MPEG-2 TS の PCR を AVC の PTS として持ちまわる事ができれば PTS の計算を省略できます(TODO: 要確認 → 出来ませんでした)
    • PCR は 27MHz(33bit * 300 + 9bit) でClockを管理しています
  • PCR Wrap-around

    • 33bit 部分は 90kHz の解像度を持ち、9bit の値(0〜299)の値を加える事で、900kHz * 300 = 27MHz の精度を出すように工夫されています
    • この33bit部分がラウンドアップし0に戻ることを PCR Wrap-around と呼びます。この現象は 0x1FFFFFFFF = 8589934591 (26:30:43.717) で発生します
    • PCR Wrap-around が発生すると音声と映像の同期が取れなくなり、映像に乱れが発生します
  • DTS (decoding time stamp, 復号時刻), PTS (presentation time stamp, 表示時刻)

    • MPEG-4 におけるI, P, B ピクチャを表示する時刻を指定するのが PTS で、デコードの順番を指示するのが DTS です。
    • PTS は DTS とその周辺情報などから算出しなければならない状況があるとか
  • PTS (Presentation Time Stamp)

    • コンテンツをいつ出力するかを指定したタイムスタンプ情報(33 bits)です。映像と音声の同期のために必要になります
    • デコーダは STC が PTS の示す時刻になるとデコード結果を映像や音声として出力します
  • STC (System Time Clock)

    • システム基準時刻です。内部クロックです
    • 90 kHz で駆動します
    • MPEG-1 のクロックはすべて90kHz単位です。STC, SCR, PTS も90KHzを基礎単位とする時刻情報となります
  • SCR (System Clock Reference)

    • ストリーム上でのシステムクロック情報(33 bits)です。
  • LipSync

    • MPEG-1 においては、音声と映像にずれが発生した場合は、音声を基準にずれを修正します
    • これは人間が音のずれに対してより敏感なためです
  • Mux (Multiplexing, Multiplexer)

    • Audio Elementary Stream と Video Elementary Stream を多重化することを Multiplexing (Mux, マクス) と呼びます。
  • Demux (Demultiplexing, Demultiplexer)

  • ESDescriptor (Elementary Stream Descriptor)

    • 14496-14 の 3.1.2 で定義されています
    • Audio Object Descriptor と Video Object Descriptor のビットストリームは Elementary Stream です
    • シーンを構成するそれぞれのオブジェクト毎にESDescriptorが存在します
  • BIFS (BInary Format for Scene description)

    • VRML (Visual Reality Modeling Language)を拡張したシーン記述言語です
    • 規格書には存在しますが、実装した民生品はありません
  • POC (Picture Order Count)

  • MMCO5 (memory_management_control_operation equal to 5)

  • MP4Boxes

    • MP4 box type 一覧 http://www.mp4ra.org/atoms.html

    • "ctts" atom, which has to be written when muxing b-frames into MP4

      ctts box は Bフレームを書き出す場合に必要です。つまり ctts がある場合は B フレームが存在します

    • "vol", which is placed on every keyframe in AVI, but has to be seperated from the movie data in MP4

      vol プロパティはキーフレーム毎に必要です。TODO: ??

  • ES (Elementary Stream)

    • 生オーディオデータやビデオデータは ES と呼ばれます
  • PS (Parameter Set)

    • sequence parameter set と picture parameter set を総称して Parameter Set と呼びます
  • Parameter Set Elementary Stream

    • elementary stream containing samples made up of only sequence and picture parameter set NAL units synchronized with the video elementary stream.

      このタイプのエレメンタリストリームに含まれるデータは、映像ストリームと同期した SPS と PPS の NALUnit です。他の種類のデータは含まれません

  • VideoES (VIDEO Elementary Stream)

    • elementary stream containing access units made up of NAL units for coded picture data

      このタイプのエレメンタリストリームに含まれるデータは、符号化された画像データです。他の種類のデータは含まれません

  • CRC32/MPEG2

    • MPEG-2 の CRC32 は、CRC32/MPEG2 と呼ばれ、通常の CRC32 とは計算式と初期値が異なります