Devo rilevare MPEG4 I-Frame nel pacchetto RTP. So come rimuovere l'intestazione RTP e ottenere il frame MPEG4, ma non riesco a capire come identificare l'I-Frame.Rileva MPEG4/H264 I-Frame (IDR) nel flusso RTP
Ha una firma/intestazione specifica?
Devo rilevare MPEG4 I-Frame nel pacchetto RTP. So come rimuovere l'intestazione RTP e ottenere il frame MPEG4, ma non riesco a capire come identificare l'I-Frame.Rileva MPEG4/H264 I-Frame (IDR) nel flusso RTP
Ha una firma/intestazione specifica?
Ok così ho capito per il flusso h264.
Come rilevare I-frame:
Non riesco a capirlo per il flusso MPEG4-ES ... qualche suggerimento?
EDIT: H264 IDR
Questo funziona per il mio flusso H264 (fmtp:96 packetization-mode=1; profile-level-id=420029;
). Basta passare la matrice di byte che rappresenta il frammento h264 ricevuto tramite RTP. Se vuoi passare l'intero RTP, correggi il valore RTPHeaderBytes
per saltare l'intestazione RTP. Ricevo sempre l'I-Frame, perché è l'unico frame che può essere frammentato, vedere here. Io uso questo pezzo di codice (semplificato) nel mio server e funziona come un fascino !!!! Se I-Frame (IDR) non è frammentato, lo fragment_type
sarebbe 5, quindi questo codice restituirà true
per gli IDR frammentati e non frammentati.
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;
}
Ecco la tabella dei tipi di unità 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]
EDIT 2: MPEG4 I-VOP
ho dimenticato di aggiornare questo ... Grazie a Che e ISO IEC 14496-2 documento, Sono riuscito a risolverlo! Che era di rito, ma non così preciso nella sua risposta ... ecco come trovare I, P e B frame (I-VOP, P-VOP, B-VOP) in breve:
000001B6
(hex). È lo stesso per tutti i frame MPEG4 (I, P, B)Segue poi molte altre informazioni, che non ho intenzione di descrivere qui (vedere la documentazione IEC), ma solo noi (come detto) abbiamo bisogno del 2 bit più alti dal byte successivo (i due bit successivi al byte con il valore B6
). Quei 2 bit indicano il VOP_CODING_TYPE, vedere la tabella:
VOP_CODING_TYPE (binary) Coding method
00 intra-coded (I)
01 predictive-coded (P)
10 bidirectionally-predictive-coded (B)
11 sprite (S)
Così, per trovare I-Frame trovare il pacchetto a partire da quattro byte 000001B6
e che presentano le più alte due bit del byte successivo 00
. Questo troverà I frame nello stream MPEG4 con un tipo di oggetto video semplice (non sono sicuro per l'avanzato semplice).
Per qualsiasi altro problema, è possibile controllare il documento fornito (ISO IEC 14496-2), è tutto ciò che si desidera sapere su MPEG4.:)
Per quanto ne so, MPEG4-ES frammenti flusso di RTP payload di solito iniziano con MPEG4 startcode, che può essere uno di questi:
0x000001b0
: visual_object_sequence_start_code (probabilmente keyframe)0x000001b6
: vop_start_code (keyframe, se i successivi due bit sono zero)0x000001b3
: group_of_vop_start_code, che contiene tre byte e poi si spera un vop_start_code che possono o non possono appartenere a un fotogramma chiave (vedi sopra)0x00000120
: video_object_layer_start_code (probabilmente keyframe)0x00000100
-0x0000011f
: video_object_start_code (quelli guardare come fotogrammi chiave, nonché)Ho paura che ti è necessario analizzare il flusso per accertarsi: -/
In realtà, si era corretti per flusso h264, se il valore NAL (primo byte) è 0x7C
significa che l'I-Frame è frammentato. Nessun altro frame (P e B) può essere frammentato, quindi se c'è in SDP
, significa che gli I-Frames sono frammentati, e quindi se leggi 0x7C
come primo byte, allora è I-Frame. Ulteriori informazioni qui: http://www.rfc-editor.org/rfc/rfc3984.txt.
0x000001b6: vop_start_code (keyframe, se i successivi due bit sono zero) questo è il modo corretto per MPEG-4
ha funzionato per me:
- capire il "tipo payload", ad esempio: Tipo di payload: DynamicRTP-Type-96 (96)
- Tell wireshark quale flusso è H264: File-> preferenze-> protocolli-> H264. Immettere 96 come tipo di carico utile.
- filtro sulla slice_type: "h264.slice_type eq 7"
Per H264:
Esempi:
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
...
questo non è corretto (nemmeno vicino). Potrebbe succedere di lavorare per i flussi che stai guardando. Verificare RFC 3984 (che verrà presto sostituito con 3984bis) presso IETF. Si noti che è possibile avere NAL frammentati (con intestazioni di frammenti, pacchetti STAP con più NAL (e l'iframe può iniziare nel secondo NAL di un pacchetto), ecc. Ecc. Si desidera veramente eseguire la scansione di tutti gli NAL nel flusso di pacchetti per NAL che introducono un IDR.Si noti che l'attuale i-frame/si-frame può essere preceduto da una serie di set di parametri sequenza e immagine, che sono * importanti * e devono essere considerati parte dell'IDR (ma non sono un marker) – jesup
Beh, funziona solo per me allora ... = | – Cipi
@jesup I set di parametri non vengono normalmente inviati fuori banda? Inoltre - ciao! Fancy incontrandoti qui ... –