RTPパケットでMPEG4 I-Frameを検出する必要があります。RTPヘッダーを削除してMPEG4フレームをそこに取得する方法を知っていますが、できません。 Iフレームを識別する方法を理解します。
特定の署名/ヘッダーはありますか?
わかりましたので、h264ストリームについて考えました。
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)を簡単に見つける方法は次のとおりです。
000001B6
(hex)で始まります。すべてのMPEG4フレーム(I、P、B)で同じです。次に、私はここでは説明しませんが(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について知りたいことがすべてあります。:)
私の知る限り、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(キーフレームのようにも見える)ストリームを解析して確認する必要があると思います:-/
NAL値(最初のバイト)が0x7C
の場合、Iフレームがフラグメント化されていることを意味します。他のフレーム(PおよびB)はフラグメント化できません。したがって、SDP
にpacketization-mode=1
がある場合、Iフレームがフラグメント化されていることを意味します。したがって、0x7C
最初のバイトとしては、Iフレームです。詳細はこちら: http://www.rfc-editor.org/rfc/rfc3984.txt 。
これは私のために働きました:
-「ペイロードタイプ」を見つけます。例:ペイロードタイプ:DynamicRTP-Type-96(96)
-WiresharkにH264のストリームを通知します:ファイル->設定->プロトコル-> H264。ペイロードタイプとして96を入力します。
-slice_type: "h264.slice_type eq 7"でフィルター
0x000001b6:vop_start_code(次の2ビットがゼロの場合のキーフレーム)これはMPEG-4の正しい方法です
H264の場合:
例:
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
...