27

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

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

4

6 に答える 6

35

わかりましたので、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_type5 になるため、このコードはtrueフラグメント化された IDR とフラグメント化されていない IDR を返します。

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 (Video Object Plane -- frame) はコード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 ストリームで I フレームが検出されます (高度な単純な場合はわかりません)。

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

于 2009-12-28T11:03:45.387 に答える
7

私の知る限り、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 (これらもキーフレームのように見えます)
  • 何か他のもの (おそらくキーフレームではない)

念のためにストリームを解析する必要があると思います:-/

于 2010-01-03T18:13:14.553 に答える
6

実際、h264 ストリームについては正しかったです。NAL 値 (最初のバイト) が0x7Cである場合、I フレームが断片化されていることを意味します。他のフレーム (P および B) はフラグメント化できません。したがって、 がある場合はpacketization-mode=1SDPI フレームがフラグメント化されていることを意味します。したがって、0x7C最初のバイトとして読み取ると、それは I フレームです。詳細については、http: //www.rfc-editor.org/rfc/rfc3984.txt を参照してください

于 2010-05-15T19:47:37.990 に答える
1

これは私にとってはうまくいっ

: ペイロード タイプとして 96 を入力します。
- slice_type:"h264.slice_type eq 7" でフィルター処理します。

于 2013-11-05T10:00:23.500 に答える
1

H264 の場合:

  1. RTP ヘッダーを削除します。
  2. チャンク NAL タイプ (最初のバイト) が SPS (7) または PPS (8) の場合、フレームを IFrame としてマークします (多くのカメラは SPS と PPS (軸を含む) を使用しません)。
  3. チャンク NAL タイプが #28 FU A (フラグメンテーション ユニット A) の場合、NAL タイプが IDR (5) (IDR (Instantaneous Decoding Refresh) ピクチャ) であるかどうかを FU ヘッダー (次のバイト) が 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
...
于 2016-10-23T00:12:47.953 に答える
0

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

于 2012-01-13T04:20:37.340 に答える