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 になるため、このコードは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) を簡単に見つける方法は次のとおりです。
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 ストリームで I フレームが検出されます (高度な単純な場合はわかりません)。
その他の問題については、提供されているドキュメント ( 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 (これらもキーフレームのように見えます)念のためにストリームを解析する必要があると思います:-/
実際、h264 ストリームについては正しかったです。NAL 値 (最初のバイト) が0x7C
である場合、I フレームが断片化されていることを意味します。他のフレーム (P および B) はフラグメント化できません。したがって、 がある場合はpacketization-mode=1
、SDP
I フレームがフラグメント化されていることを意味します。したがって、0x7C
最初のバイトとして読み取ると、それは I フレームです。詳細については、http: //www.rfc-editor.org/rfc/rfc3984.txt を参照してください。
これは私にとってはうまくいっ
た
: ペイロード タイプとして 96 を入力します。
- slice_type:"h264.slice_type eq 7" でフィルター処理します。
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
...
0x000001b6: vop_start_code (キーフレーム、次の 2 ビットがゼロの場合) これは MPEG-4 の正しい方法です