3

PES デマルチプレクサで packet_start_code_prefix (0x000001) を検索すると、新しい PES パケットが検出されます。それが発生すると、PES_packet_length を読み取ることができるので、バイト ストリームから現在の PES パケットを抽出できます。ただし、H.264 ビデオ ストリームの場合、PES_packet_length=0 です。

このような場合、PES パケットを抽出するにはどうすればよいでしょうか。0x000001 は H.264 の最終ユニット バイト ストリームでも発生する可能性があるため、次の PES パケットを見つけるためにこのプレフィックスを使用することはできません。

すべての H.264 PES パケットで、PES パケットの最後の nal ユニットが Filler データ (nal_unit_type=12) であることに気付きました。現在の PES パケットの終了を検出するために、この事実を使用する必要がありますか?

4

1 に答える 1

9

通常いいえ、これは PES パケットの長さを知らなければ不可能です。ただし、H.264 に限定しているため、幸運なアクシデントを利用できます。

h.264 の stream_id は 0xE0 です。nalu の最初のビットは常に 0 です。したがって、000001E0 は別館 B ストリーム内でたまたま不正になります。PES ヘッダーの後の最初のバイトは前の NALU の末尾である可能性があり、したがって必ずしも附属書 b 開始コードではない可能性があるため、PES ヘッダーを解析してその長さを決定する必要があります。

これを後世に残す。単純に開始コードを探すだけではなく、パケットを解析する必要があります。これがトランスポート ストリームの場合、ペイロード ユニットの開始インジケータを探すことで、PES の開始を見つけます。次に、on が存在する場合は適応フィールドを解析します。これで、開始コード (この場合は 000001E0) が得られます。次に、フラグを見てください。33 ビット PTS/DTS を解析し (再生に必要です)、任意のフィールドをスキップします (PES ヘッダーのフラグによって決定されます)。 ). これで h.264 ES の開始が得られます. TS の解析を続けます. 同じ PID とペイロード ユニット開始インジケータ = false を持つすべての TS について, フレームを読み取っています. ペイロード ユニット開始インジケータが true になったら,新しい PES パッカー/フレームがあります。

于 2014-01-29T17:42:42.247 に答える