MPEG 4 AVC H264 - uupaa/H264.js GitHub Wiki

この゚ントリでは、䞻に 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 の䞖界におけるデヌタの基本的な単䜍で NALHeader ず RBSP で構成されたす
      • 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 01 や 00 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_idc が 00 ならこの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 0x を 00 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

    • コンテクスト適応型倀算術笊号化方匏。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 ずは蚈算匏ず初期倀が異なりたす