ビデオストリームTSのパッキング方法の詳細説明

ビデオストリームTSのパッキング方法の詳細説明


先ほどPSストリームのパッケージングの詳しい説明を紹介しましたが、PESの詳細なパッケージング方法が分かりますが、TSストリームは実際にはPESの上にPATやPMTなどのPSI情報テーブルを加えてパッケージ化されています。 PESの梱包方法は、公式アカウント: One Zero Warehouse 、send: ps に注意して 、関連記事を入手してください。
HLS スライス ファイルは、一般的に TS ストリームでカプセル化されたオーディオおよびビデオ ファイルですが、ここでは主に TS ストリームのカプセル化方法を紹介します。

TS ストリーム ヘッダーのカプセル化

TSストリーム(Transport Stream)は、PESパケットをさらにカプセル化したもので、基本単位はTSパケットであり、固定パケットサイズは188バイト(または204バイト、および188バイトの後にCRCチェックデータ16バイトを加えたもの)であり、TSヘッダーからなるTSヘッダーは、
1
4 バイトの固定ヘッダーとそれに続く追加フィールド (適応フィールド) で構成され、バイト順で次のように説明されます。

  • sync_byte: 同期コード、サイズは 8 ビット固定、値は 0x47
  • transport_error_indicator: エラー フラグ ビット、占有 1 ビット、1 に設定すると、このパケットに少なくとも 1 つの訂正不可能なエラーがあることを意味します。通常は 0 です。
  • payload_unit_start_indicator: TS パケットのペイロードが PES パケットまたは PSI データを含み、1 ビットを占めることを示すために使用されるペイロード開始フラグ; この値が 1 で、ペイロードが PSI データである場合、TS ヘッダーの後に、ペイロード開始バイトTS パケットロードが PES パケットデータの場合、payload_unit_start_indicator は 1 に設定され、TS パケットの有効なペイロードが PES パケットの最初のバイト、つまり TS パケットから始まることを示します。は PES パケットの先頭パケットであり、この TS パケットには PES パケットの先頭フィールドが 1 つだけあり、0 に設定され、TS パケットが PES パケットの先頭パケットではなく、次のデータであることを示します。パケット; TS パケットのロードが PSI データの場合、payload_unit_start_indicator は 1 に設定され、TS パケットが PSI データ セグメントの最初のバイトを含むこと、つまり、TS パケットが PSI セクションの開始パケットであることを示します。 TS パケットのペイロードの最初のバイト with pointer_field; TS パケットが PSI セクションの最初のバイトを含まないこと、つまり、TS パケットが PSI の開始パケットではないことを示す 0 に設定されます。ペイロードに point_field はなく、ペイロードの先頭は PSI コンテンツのデータです。point_field の定義は、次の PSI で導入されます。空のパケットの場合、payload_unit_start_indicator は 0 に設定されます。たとえば、TS パケットのペイロードが PAT の場合、受信した TS パケットのpayload_unit_start_indicator が 1 の場合、TS がパケットには PAT ヘッダー情報が含まれており、このパケットから section_length と Continuity_counter を解析し、その後、payload_unit_start_indicator=0 を後ろに持つ TS パケットを引き続き収集し、continuity_counter の連続性を判断して、TS パケット内のペイロードを連続して読み取ります (つまり、 、PAT データ)、TS パケットを収集するための終了条件として section_length を使用します。
  • transport_priority: 送信優先度。1 に設定すると、このパケットが同じ PID を持つ他のパケットよりも高い優先度を持つことを意味します。0 に設定すると、1 ビットを占有します。
  • PID: ペイロードのデータ タイプを示し、13 ビットを占めます; 0x0000 は PAT を表し、0x0001 は CAT を表し、0x0002-0x000F は予約され、0x1FFF は空のパケットを表します。
  • transport_scrambling_control: ペイロード暗号化モード フラグ。2 ビットを占有します。00 は暗号化されていないことを意味します。
  • adapt_field_control: TS ヘッダーが調整フィールドまたはペイロード データのどちらに続くかを示す調整フィールド フラグ。2 ビットを占有し、そのうち 00 は予約されています。01 は調整フィールドなし、ペイロード データのみを意味し、10 は調整フィールドのみを意味し、ペイロードなしを意味します。調整フィールドがあり、その後にペイロードが続きます。空のパケットの場合、このフィールドは 01 である必要があります。adaptation_field_control == 1x の場合、適応フィールド フィールドが続くことを意味します。adaptation_field_control == x1 の場合、data_bytes フィールドが続くことを意味します。
  • Continuity_counter: 同じ PID を持つ TS パケットごとに増加し、最大値に達すると 0 に戻る連続カウント; 4 ビットを占有し、adaptation_field_control の値が 00 または 01 の場合、この値は増加しない; フラグ ビットが調整フィールドの discontinuity_indicator 値が 1 の場合、この値は連続的ではありません。
  • 適応フィールド: 調整フィールド、次のフィールドはadaptation_field_control == 1xの場合のみ存在し、内容は次のとおりです:
    adaptation_field_length:調整フィールド長マーク、このバイトの後の調整フィールドの長さを示し、8ビットを占めます;値が0、調整バイトが TS パケットに挿入され、その後に調整フィールドがなく、その後にペイロードが続くことを示します; adapt_field_control == '11' の場合、この値は 0 ~ 182 であり、adaptation_field_control == '10' の場合、この値は 183 です。フィールドがそれほど長くない場合は、0xFF フィールドに入力します。次のフィールドは、adaptation_field_length>0 の場合にのみ表示され、順序は次のとおりです。
  • discontinuity_indicator: 1 ビットを占有する不連続ステータス インジケータ。1 に設定されている場合、この TS パケットの不連続ステータスが真であることを意味します。
  • random_access_indicator: 1 ビットを占有するランダム アクセス インジケータ。
  • Elementary_stream_priority_indicator: 1 ビットを占めるプリミティブ ストリーム データ優先度インジケータ。1 を設定すると、このプリミティブ ストリーム データが、同じ PID を持つ TS パケット内の他のプリミティブ ストリームよりも高い優先度を持つことを意味します。
  • PCR_flag: PCR フラグ。1 ビットを占有します。1 を設定すると、調整フィールドに PCR フィールドが含まれることを意味し、0 を設定すると、PCR フィールドがないことを意味します。
  • OPCR_flag: 1 ビットを占める OPCR フラグ。1 を設定すると、調整フィールドに OPCR フィールドが含まれることを意味し、0 を設定すると、OPCR フィールドがないことを意味します。
  • splicing_point_flag: splice_countdown フラグ。1 ビットを占有します。1 を設定すると、splice_countdown フィールドが調整フィールドに含まれることを意味し、0 を設定すると、splice_countdown フィールドがないことを意味します。
  • transport_private_data_flag: transport_private_data フラグ。1 ビットを占有します。1 に設定されている場合、調整フィールドに 1 つ以上のプライベート データ バイトが含まれていることを意味します。0 に設定されている場合、そのようなバイトはありません。
  • adapt_field_extension_flag: 調整フィールド拡張フラグ ビット、1 ビットを占有、1 を設定すると調整フィールド拡張フィールドが含まれることを意味し、0 を設定すると拡張フィールドがないことを意味します; 上記の 8 ビットは識別子であり、その後に値に応じて決定されるフィールドが続き
    ます識別子のシーケンスは次のとおりです。
  • PRC フィールド: このフィールドは、PCR_flag == 1 の場合にのみ存在し、48 ビットを占有し、順序は次のとおりです。
  • program_clock_reference_base フィールド: 33 ビットを占有します。
  • 予約済みフィールド: 6 ビットを占有します。
  • program_clock_reference_extension フィールド: 9 ビットを占有します。
  • OPRC フィールド: このフィールドは、OPCR_flag == 1 の場合にのみ存在し、48 ビットを占有し、順序は次のとおりです。
  • original_program_clock_reference_base フィールド: 33 ビットを占有します。
  • 予約済みフィールド: 6 ビットを占有します。
  • original_program_clock_reference_extension フィールド: 9 ビットを占有します。
  • splice_countdown フィールド: このフィールドは、splicing_point_flag == 1 の場合に存在し、8 ビットを占有します。
  • transport_private_data フィールド: プライベート データ フィールド。このフィールドは、transport_private_data_flag == 1 の場合に存在し、N*8 ビットを占有します。バイト順は次のとおりです。
  • transport_private_data_length: 8 ビットを占有するプライベート データのバイト長を示します。
  • private_data_byte: プライベート データ。長さは前の長さフィールドによって決定されます。
  • adapt_field_extension フィールド: 調整フィールド拡張フィールド, 占有長は不明です, このフィールドはadaptation_field_extension_flag == 1の場合に存在します. フィールドには3つのフラグビットもあり, 一部のフィールドが存在するかどうかを判断します. 具体的なバイトオーダーは次のとおりです:
  • adapt_field_extension_length: フィールド拡張フィールドの長さを調整し、8 ビットを占有します。
  • ltw_flag: ltw フィールド フラグ ビット。1 に設定すると、このフィールドが存在し、1 ビットを占めることを意味します。
  • piecewise_rate_flag: piecewise_rate フィールド フラグ ビット。このフィールドは、ビットが 1 に設定されている場合に存在し、1 ビットを占有します。
  • seamless_splice_flag: seamless_splice フラグ。このフィールドは、1 に設定されている場合に存在し、1 ビットを占有します。
  • 予約済み: 予約済みフィールドで、5 ビットを占めます。
  • Ltw フィールド: このフィールドは、ltw_flag == 1 の場合に存在し、16 ビットを占有し、次の 2 つのフィールドで構成されます。
  • ltw_valid_flag: 1 ビットを占有します。ltw_valid_flag == 1 の場合、ltw_offset は有効です。
  • ltw_offset: 15 ビットを占有します。
  • piecewise_rate フィールド: このフィールドは、piecewise_rate_flag == 1 の場合に存在し、24 ビットを占有し、そのバイト オーダーは次のとおりです。
  • 予約済みフィールド: 予約済みフィールド。2 ビットを占有します。
  • piecewise_rate フィールド: 22 ビットを占有します; このフィールドは、ltw_flag == 1 および ltw_valid_flag == 1 の場合にのみ定義され、定義されている場合、このフィールドは正の整数です。
  • seamless_splice フィールド: このフィールドは、seamless_splice_flag == 1 の場合に存在し、40 ビットを占めます; バイト オーダーは次のとおりです:
  • splice_type フィールド: 4 ビットを占有し、遅延とレートの値を識別します。
  • DTS_next_AU[32...30]: 3 ビットを占有します。
  • marker_bit フィールド: 1 ビットを占有します。
  • DTS_next_AU[29...15] フィールド: 15 ビットを占有します。
  • marker_bit: 1 ビットを占有します。
  • DTS_next_AU[14...0]: 15 ビットを占有します。
  • marker_bit: 1 ビットを占有します。
  • stuffing_byte: 充填フィールド、0xFF に固定。
  • Payload_bytes: ペイロード フィールド、PES パケットからのバイト、PSI パーツなど。

PSI (プログラム固有情報シート)

TSヘッダーの後にあるのはペイロードの内容であり、PESパケットのデータまたはPSI情報である可能性があります.PSI情報は主にPAT、PMT、CATなどで構成されています.ここでは主に2つの情報テーブルを紹介します. PAT と PMT; 上記より 記載されている情報はペイロードの種類が PID によって決まることを示しています. 一般に PID=0x0000 の場合、ペイロードは PAT であり、PID=0x0001 の場合、ペイロードは CAT であり、PMT の PID が指定されます. PAT; PSI も
可能です: 特別なフィールド、Point_field フィールドがあります: ヘッダーに続き、8 ビットを占有し、ペイロードに属し、このフィールドの先頭と PSI セクションの最初のバイトの間のバイト数を示しますペイロード; payload_unit_start_indicator == 1 の場合、このフィールドのみが存在します; point_field == 0x00 の場合、このバイトの後に PSI セクションの開始バイトが続くことを意味します; このフィールドはペイロードに含まれ、長さに含まれますペイロードの;

PAT:番組関連表

PAT は、主にプログラム番号と各プログラムに対応する PMT の PID 番号を含み、プログラム番号とプログラム定義情報を含む TS パケット (PMT パケット) の PID との対応を提供します (通常は 1 つだけです)。私たちの TS ストリーム) プログラム (チャネル) であるため、通常、PAT には 1 つの PMT しかありません);
テーブル全体は多くのフィールドで構成されています; このテーブルは、送信のために複数のサブセクションに分割される場合があります。つまり、PAT は複数の TS に分割される場合があります。送信用のパケット; PAT のデータ セグメント セクションは、次のフィールドで構成されています。
1

  • table_id フィールド: 8 ビットを占める PSI セグメントの内容を示す. table_id == 0x00 の場合, このセグメントが PAT セグメントであることを意味する. table_id == 0x01 の場合, このセグメントが CAT セグメントであることを意味する. table_id = の場合= 0x02、このセグメントが PMT セグメントであることを示します; PAT では、id の値は 0x00 です;
  • section_syntax_indicator フィールド: 1 ビットを占有し、'1' に固定されます。
  • 「0」フィールド: 1 ビットを占有します。
  • 予約フィールド: 予約フィールド、2 ビットを占有します。
  • section_length フィールド: 12 ビットを占めるセグメント長。最初の 2 ビットは「00」に固定され、最後の 10 ビットは、CRC の長さを含む次のセクション フィールドの長さを示します。
  • transport_stream_id フィールド: ネットワーク内の他の多重化からこの TS ストリームを識別するために使用される TS ストリーム識別 ID。その値はユーザーによって定義され、16 ビットを占有します。
  • 予約済み: 予約済みフィールドで、2 ビットを占有します。
  • version_number フィールド: 5 ビットを占める PAT 全体のバージョン番号; PAT が変更されると、その値は 0 から 31 まで周期的に累積されます。current_next_indicator == 1 の場合、version_number は現在の PAT のバージョン番号です。current_next_indicator == の場合0、その値は次の PAT のバージョン番号です。
  • current_next_indicator フィールド: 1 ビットを占有するインジケータで、1 に設定されている場合は現在の PAT が有効であることを意味し、0 に設定されている場合は現在の PAT が無効であることを意味し、次の PAT が有効であることを意味します。
  • section_number フィールド: 8 ビットを占めるこのセクションのシリアル番号。PAT の最初のセクションのシリアル番号は 0x00 で、PAT の各セクションで 1 ずつ累積されます。
  • last_section_numberフィールド:PATの最後のセクションの通し番号、すなわち最大の通し番号値であり、8ビットを占める。
  • ループ:
  • program_number フィールド: 16 ビットを占有し、PMT で使用可能なプログラムの番号を示します; program_number == 0x0000 の場合、次に参照する PID はネットワーク PID であり、それ以外の場合の値はユーザーによって定義されます; PAT の version_number では、この値をとることはできません。単一の値が複数回あります (つまり、PAT セクション セクション内のプログラム番号とその PMT PID の間でのみ対応することができます)。
  • 予約済み: 予約済みフィールドで、3 ビットを占有します。
  • network_PID フィールド: ネットワーク PID、占有 13 ビット、このフィールドは program_number == 0x0000 の場合にのみ存在; ネットワーク情報テーブル NIT を含む TS パケットの PID 値を示す;
  • program_map_PID フィールド: program_number! の場合、13 ビットを占有します。= 0x0000、このフィールドは存在し、program_number で指定されたプログラムで使用可能な PMT セグメントの TS パケットの PID 値を示します; 1 - program_number には複数の program_map_PID 割り当てが含まれていてはならず、この program_map_PID の値はユーザーによって定義されます。ただし、他の目的のために予約された値と見なすことはできません。
  • ループエンド;
  • CRC_32 フィールド: 32 ビットを占める CRC チェック値。

PMT: プログラム マッピング テーブル

PMT は、プログラム番号と、それらを構成するプログラムの元のストリームとの間のマッピング関係を提供します.TS ストリームに複数のプログラムがある場合、異なる PID を持つ複数の PMT テーブルが存在します.各 PMT には、プログラムが含まれます.元のストリームにおける異なるストリーム タイプの TS パケットに対応する PID、つまり、PMT では、現在の番組内のこの番組に関連するビデオ ストリーム、オーディオ ストリーム、およびその他のデータを識別する TS パケットに対応する PID 値; PAT と同様に
、PMT も送信のために 1 つまたは複数のセクション セグメントに分割される場合があります。PMT は多くのフィールドで構成され、フィールドの順序は次のとおりです。
1

  • table_id フィールド: PSI セグメントの内容を示し、8 ビットを占有し、PMT で 0x02 に固定されます。
  • section_syntax_indicator フィールド: 1 ビットを占有し、'1' に固定されます。
  • 「0」フィールド: 1 ビットを占有します。
  • 予約フィールド: 予約フィールド、2 ビットを占有します。
  • section_length フィールド: 12 ビットを占めるセグメント長。最初の 2 ビットは「00」に固定され、最後の 10 ビットは、CRC の長さを含む次のセクション フィールドの長さを示します。
  • program_number フィールド: この PMT に対応するプログラム番号を指定する 16 ビットを占めるプログラム番号であり、TS の PMT セクションに含めることができるプログラム定義は 1 つだけです。
  • 予約フィールド: 予約フィールド、2 ビットを占有します。
  • version_number フィールド: この PMT セグメントのバージョン番号、占有 5 ビット、このセグメント情報の変更で 1 を累積し、31 に達すると 0 サイクルに戻ります; バージョン番号は単一のプログラムの定義に対応します。 、単一のセグメンテーションに対応します。current_next_indicator == 1 の場合、number の値は現在の PMT セグメントのバージョン番号です。current_next_indicator == 0 の場合、number の値は、次に利用可能な PMT セグメントのバージョン番号です。
  • current_next_indicator フィールド: 1 ビットを占有する指標であり、1 に設定されている場合、現在の PMT セグメントが有効であることを意味し、0 に設定されている場合、現在の PMT セグメントが無効であることを意味し、次の PMT セグメントが有効であることを意味します。 ;
  • section_number フィールド: 8 ビットを占有し、0x00 に固定されます。
  • last_section_number フィールド: 8 ビットを占有し、0x00 に固定されます。
  • 予約フィールド: 予約フィールド、3 ビットを占有します。
  • PCR_PID フィールド: PCR が配置されている TS パケットの PID 値で、13 ビットを占めます; program_number で指定されたプログラムで、PCR フィールドを含む TS パケットの PID 値を示します;プライベート ストリームのプログラム定義にそれに関連する PCR。このフィールドは 0x1FFF に設定する必要があります。
  • 予約フィールド: 予約フィールド、4 ビットを占有します。
  • program_info_length フィールド: 12 ビットを占める長さフィールド; 最初の 2 ビットは 00 に固定され、最後の 10 ビットはこのフィールドの後の記述子のバイト数を示します。
  • 記述子フィールド: プログラム記述情報、長さは前のフィールドによって決定されます。
  • ループ:
  • stream_type フィールド: ストリーム タイプ フィールド、8 ビットを占有; Elementary_PID で指定された TS パケットのペイロード内のプログラム ストリームのタイプ、つまり、オーディオおよびビデオのコーディング タイプを指定; 通常使用される stream_type 列挙: 0x10-MPEG-4 ビデオ ストリーム; 0x1B-H264;0x24-H265;0x80-SVAC;0x90-G711;0x92-G722.1;0x99-G.729;0x9B-SVAC;0x0f-AAC
  • 予約フィールド: 予約フィールド、3 ビットを占有します。
  • Elementary_PID フィールド: PID フィールド、13 ビットを占有し、当該オリジナル ストリーム ES を伝送する TS パケットの PID 値、つまり、ビデオ パケットやオーディオ パケットなどの TS パケットの PID 値を示します。
  • 予約フィールド: 予約フィールド、4 ビットを占有します。
  • ES_info_length フィールド: 12 ビットを占める長さフィールド; 最初の 2 ビットは 00 に固定され、最後の 10 ビットは、このフィールドの後の関連するプログラムの元のストリーム ES の記述フィールド長を表します。
  • 記述子フィールド: ES ストリームの記述情報。長さは前のフィールドによって決定されます。
  • ループ終了;
  • CRC_32 フィールド: 32 ビットを占める CRC チェック値。

TS パケット キャプチャ インスタンスの分析

Wireshark から抽出された ts ファイルを介して、次のように Elecard StreamEye Tools ソフトウェア (ソフト ソリューションは公式アカウント: Yilingcang をフォローし、ビデオ ストリーム分析を送信し、ツールを取得
1
できます)を介して分析が実行されます。TS分析のプロセス:

  • PID=0 に従って、PAT を見つけて分析し、PAT プログラムに関連付けられた PMT に従って、PMT の数と PMT に対応する PID を分析します. 通常、デフォルトでは PMT は 1 つだけです。
  • PMT に対応する PID に従って、プログラム マッピング テーブルに含まれるすべてのストリーム、ストリーム タイプ、およびストリーム PID を見つけて解析します。ここで、各ストリームのストリーム タイプと PID がわかります。
  • ストリーム タイプの意味に従って、分析する必要があるストリーム タイプに対応する PID を見つけ、この PID に従って実際のオーディオおよびビデオ ストリームを見つけます。

TS のカプセル化解除とパッケージングは​​、このプロセスに従って設計できます。

要約する

TS には多くの定義があります. 実際に TS カプセル化とカプセル化解除のコードを実際に開発するとき, ごくわずかなフィールドに注意を払う必要があります. カプセル化とカプセル化解除の多くのフィールドはデフォルト値であり, オプションフィールドのほとんどは利用できません. . ffmpeg 関連のコードを参照してください。

おすすめ

転載: blog.csdn.net/water1209/article/details/128718710