web-dev-qa-db-ja.com

RTPストリームでMPEG4 / H264 Iフレーム(IDR)を検出する

RTPパケットでMPEG4 I-Frameを検出する必要があります。RTPヘッダーを削除してMPEG4フレームをそこに取得する方法を知っていますが、できません。 Iフレームを識別する方法を理解します。

特定の署名/ヘッダーはありますか?

25
Cipi

わかりましたので、h264ストリームについて考えました。

Iフレームを検出する方法:

  • 削除RTPヘッダー
  • h264ペイロードの最初のバイトの値を確認してください
  • 値が124(0x7C)の場合、Iフレームです。

MPEG4-ESストリームでそれを理解できません...何か提案はありますか?

編集:H264 IDR

これは私のh264ストリーム(fmtp:96 packetization-mode=1; profile-level-id=420029;)で機能します。 RTPを介して受信したh264フラグメントを表すバイト配列を渡すだけです。 RTP全体を渡す場合は、RTPHeaderBytes値を修正して、スキップするようにRTPヘッダーを指定します。フラグメント化できる唯一のフレームであるため、常にIフレームを取得します。 、 ここ を参照してください。この(簡略化された)コードをサーバーで使用しており、これはチャームのように動作します!!!! Iフレーム(IDR)がフラグメント化されていない場合、fragment_typeは5になるため、このコードは断片化されたIDRではなく断片化されたIDRに対してtrueを返します。

public static bool isH264iFrame(byte[] paket)
    {
        int RTPHeaderBytes = 0;

        int fragment_type = paket[RTPHeaderBytes + 0] & 0x1F;
        int nal_type = paket[RTPHeaderBytes + 1] & 0x1F;
        int start_bit = paket[RTPHeaderBytes + 1] & 0x80;

        if (((fragment_type == 28 || fragment_type == 29) && nal_type == 5 && start_bit == 128) || fragment_type == 5)
        {
            return true;
        }

        return false;
   }

NALユニットタイプの表は次のとおりです。

 Type Name
    0 [unspecified]
    1 Coded slice
    2 Data Partition A
    3 Data Partition B
    4 Data Partition C
    5 IDR (Instantaneous Decoding Refresh) Picture
    6 SEI (Supplemental Enhancement Information)
    7 SPS (Sequence Parameter Set)
    8 PPS (Picture Parameter Set)
    9 Access Unit Delimiter
   10 EoS (End of Sequence)
   11 EoS (End of Stream)
   12 Filter Data
13-23 [extended]
24-31 [unspecified] 

編集2:MPEG4 I-VOP

私はこれを更新するのを忘れていました... Cheと ISO IEC 14496-2 ドキュメントに感謝します、私はこれをうまく管理しました!Cheは儀式でしたが、それほど正確ではありませんでした彼の答えでは...つまり、I、P、Bフレーム(I-VOP、P-VOP、B-VOP)を簡単に見つける方法は次のとおりです。

  1. VOP(ビデオオブジェクトプレーン-フレーム)は、コード000001B6(hex)で始まります。すべてのMPEG4フレーム(I、P、B)で同じです。
  2. 次に、私はここでは説明しませんが(IEC docを参照)、さらに多くの情報が続きますが、(cheが言ったように)次のバイトの上位2ビット(次の2つ)だけが必要です値がB6のバイトの後のビット)。これらの2ビットはVOP_CODING_TYPEを示します。次の表を参照してください:

    VOP_CODING_TYPE (binary)  Coding method
                          00  intra-coded (I)
                          01  predictive-coded (P)
                          10  bidirectionally-predictive-coded (B)
                          11  Sprite (S)
    

したがって、Iフレームを見つけるには、4バイト000001B6で始まり、次のバイトの上位2ビット00を持つパケットを見つけます。これにより、シンプルなビデオオブジェクトタイプのMPEG4ストリームのフレームが見つかります(高度なシンプルオブジェクトではわかりません)。

その他の問題については、提供されているドキュメントを確認できます( ISO IEC 14496-2 )、MPEG4について知りたいことがすべてあります。:)

31
Cipi

私の知る限り、RTPペイロードのMPEG4-ESストリームフラグメントは通常、MPEG4スタートコードで始まります。これは次のいずれかです。

  • 0x000001b0:visual_object_sequence_start_code(おそらくキーフレーム)
  • 0x000001b6:vop_start_code(次の2ビットがゼロの場合のキーフレーム)
  • 0x000001b3:group_of_vop_start_code。これには3バイトが含まれ、うまくいけば、キーフレームに属している場合と属していない場合があるvop_start_code(上記を参照)
  • 0x00000120:video_object_layer_start_code(おそらくキーフレーム)
  • 0x00000100-0x0000011f:video_object_start_code(キーフレームのようにも見える)
  • 他のもの(おそらくキーフレームではない)

ストリームを解析して確認する必要があると思います:-/

7
che

NAL値(最初のバイト)が0x7Cの場合、Iフレームがフラグメント化されていることを意味します。他のフレーム(PおよびB)はフラグメント化できません。したがって、SDPpacketization-mode=1がある場合、Iフレームがフラグメント化されていることを意味します。したがって、0x7C最初のバイトとしては、Iフレームです。詳細はこちら: http://www.rfc-editor.org/rfc/rfc3984.txt

6
Sendro

これは私のために働きました:
-「ペイロードタイプ」を見つけます。例:ペイロードタイプ:DynamicRTP-Type-96(96)
-WiresharkにH264のストリームを通知します:ファイル->設定->プロトコル-> H264。ペイロードタイプとして96を入力します。
-slice_type: "h264.slice_type eq 7"でフィルター

1
Ola Andersson

0x000001b6:vop_start_code(次の2ビットがゼロの場合のキーフレーム)これはMPEG-4の正しい方法です

0
ciphor

H264の場合:

  1. RTPヘッダーを削除します。
  2. チャンクNALタイプ(最初のバイト)がSPS(7)またはPPS(8)の場合、フレームをIFrameとしてマークします(多くのカメラはSPSを使用せず、PPS (軸を含む))。
  3. チャンクのNALタイプが#28 FU A(フラグメンテーションユニットA)の場合、FUヘッダー(次のバイト))がNALタイプIDR(5)(IDR (即時デコードリフレッシュ)画像)はIFrameです。

例:

nal_ref_idc: 3, nal type: 7 (0x07) descripcion: 7 (SPS)<br>
00000000  24 00 00 2B 80 60 22 ED 96 57 3E 68 57 F3 22 B5  $..+.`"í.W>hWó"µ<br>
00000010  67 64 00 1E AD 84 01 0C 20 08 61 00 43 08 02 18  Gd..­... .a.C...

00000020  40 10 C2 00 84 2B 50 5A 09 34 DC 04 04 04 08  @.Â..+PZ.4Ü....<br>
nal_ref_idc: 3, nal type: 8 (0x08) descripcion: 8 (PPS)<br>
00000000  24 00 00 10 80 60 22 EE 96 57 3E 68 57 F3 22 B5  $....`"î.W>hWó"µ
00000010  68 EE 3C B0  hî<°

FU_A (fragmentation unit A) 
nal_ref_idc: 3, nal type: 5 (0x05) descripcion: 5 (IDR (Instantaneous Decoding Refresh) Picture)
00000000  24 00 05 96 80 60 22 F1 96 57 3E 68 57 F3 22 B5  $....`"ñ.W>hWó"µ
00000010  7C 05 A0 AA 2F 81 92 AB CA FE 9E 34 D8 06 AD 74  |. ª/..«Êþ.4Ø.­t
...
0
JOCh