2009-12-24 15 views

risposta

30

Ok così ho capito per il flusso h264.

Come rilevare I-frame:

  • intestazione rimuovi RTP
  • controllo il valore del primo byte in H264 payload
  • se il valore è 124 (0x7C) è un 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:

  1. VOP (Video Object Plane - frame) inizia con un codice 000001B6 (hex). È lo stesso per tutti i frame MPEG4 (I, P, B)
  2. 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.:)

+4

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

+0

Beh, funziona solo per me allora ... = | – Cipi

+0

@jesup I set di parametri non vengono normalmente inviati fuori banda? Inoltre - ciao! Fancy incontrandoti qui ... –

7

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é)
  • qualcos'altro (probabilmente non è un fotogramma chiave)

Ho paura che ti è necessario analizzare il flusso per accertarsi: -/

6

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.

0

0x000001b6: vop_start_code (keyframe, se i successivi due bit sono zero) questo è il modo corretto per MPEG-4

1

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"

1

Per H264:

  1. rimuovere intestazione RTP.
  2. Se il tipo di blocco NAL (nel primo byte) è SPS (7) o PPS (8) contrassegnare il frame come IFrame (molte telecamere non utilizzano SPS e PPS (asse incluso)).
  3. Se il tipo NAL del blocco è # 28 FU A (unità di frammentazione A), controllare l'intestazione FU (byte successivo) se l'IDR di tipo NAL (5) (IDR (istantanea decodifica aggiornamento)) è un IFrame.

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 
...