2016-06-02 47 views
7

Görüntüleri H.264 akışına kodlamak için FFMpeg'in api'sini kullanıyorum, kod bu encode code gibidir. avcodec_encode_video2 işlevini çağırdığımda, bir AVPacket veri aldım, sonra dosyayı dosyaya kaydettim. Test için birkaç dosya almak için birkaç resim kullanırım. 00 00 00 01 veya 00 00 01 kod numarasına dayanarak, 1. ve 2. dosyaların verilerinin birkaç H.264 NAL Uints içerdiğini buldum. Ama üçüncü dosyadan başla, başlangıç ​​kodunu bulamıyorum. İzlenen görüntü gibi. PictureAVPacket ile FFMpeg ve H.264 NAL Uint arasındaki ilişki nedir?

Kafam karıştı. FFMpeg'in kodundaki temelde, bir AVPacket'in verisinin en az bir NAL Uint içermesi gerektiğini düşünüyorum, ancak sonuç beklenmedik bir durumdur. Bu, bir NAL Uint'in iki AVPackets'in verisine bölünebileceği anlamına mı geliyor? AVPacket ve H.264 NAL Uint arasındaki ilişki nedir?

+0

Kodunuzu gösterebilir misiniz? Kodlama çağrınızın aslında bir paket (got_packet_ptr == 0) veya benzeri bir şey döndürmediğinden şüpheleniyorum. –

+0

[FFmpeg doxygen] 'dan (http://ffmpeg.org/doxygen/trunk/group__lavc__encoding.html#gaa2dc9e9ea2567ebb2801a08153c7306b) avcodec_encode_video2' üzerinde: * Ham video girişini çerçeveden alır ve eğer varsa, bir sonraki çıktı paketini yazar. . Enkoderlerin ihtiyaç duyulduğunda dahili çerçeveleri geciktirip yeniden sıralayabilmeleri nedeniyle çıktı paketi ** en güncel kareye ** ilişkin verileri içermez. * Muhtemelen bu şekilde bölünmüştür. Verilerini birleştirip, şikayet edip etmediğini görmek için onu kod çözücüye aktarabiliyor musunuz? – incBrain

+0

@ RonaldS.Bultje Programımı debug ettim, 'got_output' aslında her seferinde doğrudur. – Ello

cevap

0

Bazı testlerden sonra, bu sadece benim aptal hatam olduğunu buldum.
Qt içinde QtttteArray için avpkt ve setRawData aldım, sonra da bytearray dosyasını dosyaya kaydedin. Kaydetmeden önce avpkt'i sıfırlamak için av_packet_unref'u aradım. setRawData'un avpkt'ın verilerini kopyalayacağını düşündüm, ancak aslında QByteArray yalnızca veri işaretçisini içerir. Bir AVPacket'in verileri en az bir tam NAL Uint içerdiğinden, doğrudur. Önce test sonra

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

başlayanlar dışında, şu NAL her 00 00 01 ayrılmış ve NAL tipi çok aynıdır. Her AVPacket en az bir NAL içermelidir.

İlgili konular