2016-06-02 72 views
7

Uso l'API di FFMpeg per codificare le immagini sullo stream H.264, il codice è come questo encode code. Quando ho chiamato la funzione avcodec_encode_video2 ho ricevuto i dati di un AVPacket, quindi l'ho salvato su file. Io uso diverse immagini per ottenere diversi file per il test. In base al codice di avviamento 00 00 00 01 o 00 00 01, ho trovato che i dati del 1 ° e del 2 ° file contengono diversi U2 NAL U.264. Ma partendo dal terzo file, non riesco a trovare il codice di avviamento. Come l'immagine seguita. PictureQual è la relazione tra AVPacket in FFMpeg e H.264 NAL Uint?

Mi sento confuso. Base sul codice FFMpeg Penso che i dati di un AVPacket debbano contenere almeno un UAL NAL, ma il risultato è inaspettato. Ciò significa che un NAL Uint può essere diviso in due dati di AVPackets? Qual è la relazione tra AVPacket e H.264 NAL Uint?

+0

Puoi mostrare il tuo codice? Sospetto che la tua chiamata di codifica non abbia effettivamente restituito un pacchetto (got_packet_ptr == 0) o qualcosa del genere. –

+0

Da [FFmpeg doxygen] (http://ffmpeg.org/doxygen/trunk/group__lavc__encoding.html#gaa2dc9e9ea2567ebb2801a08153c7306b) su 'avcodec_encode_video2': * Prende i dati di input video grezzi dal frame e scrive il successivo pacchetto di output, se disponibile, in avpkt . Il pacchetto di output ** non contiene necessariamente i dati per il fotogramma più recente **, poiché gli encoder possono ritardare e riordinare i fotogrammi di input internamente secondo necessità. * Probabilmente è diviso. Puoi concatenare i dati e inviarli al decoder per vedere se si lamenta o no? – incBrain

+0

@ RonaldS.Bultje Effettuo il debug del mio programma, il 'got_output' è effettivamente vero ogni volta. – Ello

risposta

0

Dopo alcuni test, ho scoperto che è solo il mio stupido errore.
Ho ottenuto l'avpkt e setRawData in QByteArray in Qt, quindi salviamo il file bytearray nel file. Prima di salvare, ho chiamato av_packet_unref per resettare l'avpkt. Ho pensato che setRawData copi i dati di avpkt, ma in realtà il QByteArray contiene solo il puntatore di dati. Quindi i dati di un AVPacket contengono almeno un NAL Uint completo, è corretto.

1
00 00 00 01 41..... 
........00 00 01 41 
....00 00 01 41...... 
....... 

dopo il test, eccetto i principianti, il seguente NAL separate da 00 00 01, e tipo NAL è stesso, anche. Quindi ogni AVPacket dovrebbe includere almeno un NAL.