Codificación de YUV420P en bruto con h264 con AVCodec en iOS

Estoy tratando de codificar una sola image YUV420P recostackda de un CMSampleBuffer a un AVPacket para que pueda enviar el video h264 a través de la networking con RTMP.

El ejemplo del código publicado parece funcionar como avcodec_encode_video2 devuelve 0 (éxito), sin embargo, got_output también es 0 ( AVPacket está vacío).

¿Alguien tiene experiencia en la encoding de video en dispositivos iOS que podrían saber lo que estoy haciendo mal?

 - (void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { // sampleBuffer now contains an individual frame of raw video frames CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); CVPixelBufferLockBaseAddress(pixelBuffer, 0); // access the data int width = CVPixelBufferGetWidth(pixelBuffer); int height = CVPixelBufferGetHeight(pixelBuffer); int bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0); unsigned char *rawPixelBase = (unsigned char *)CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0); // Convert the raw pixel base to h.264 format AVCodec *codec = 0; AVCodecContext *context = 0; AVFrame *frame = 0; AVPacket packet; //avcodec_init(); avcodec_register_all(); codec = avcodec_find_encoder(AV_CODEC_ID_H264); if (codec == 0) { NSLog(@"Codec not found!!"); return; } context = avcodec_alloc_context3(codec); if (!context) { NSLog(@"Context no bueno."); return; } // Bit rate context->bit_rate = 400000; // HARD CODE context->bit_rate_tolerance = 10; // Resolution context->width = width; context->height = height; // Frames Per Second context->time_base = (AVRational) {1,25}; context->gop_size = 1; //context->max_b_frames = 1; context->pix_fmt = PIX_FMT_YUV420P; // Open the codec if (avcodec_open2(context, codec, 0) < 0) { NSLog(@"Unable to open codec"); return; } // Create the frame frame = avcodec_alloc_frame(); if (!frame) { NSLog(@"Unable to alloc frame"); return; } frame->format = context->pix_fmt; frame->width = context->width; frame->height = context->height; avpicture_fill((AVPicture *) frame, rawPixelBase, context->pix_fmt, frame->width, frame->height); int got_output = 0; av_init_packet(&packet); avcodec_encode_video2(context, &packet, frame, &got_output) // Unlock the pixel data CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); // Send the data over the network [self uploadData:[NSData dataWithBytes:packet.data length:packet.size] toRTMP:self.rtmp_OutVideoStream]; } 

Nota: Se sabe que este código tiene pérdidas de memory porque no estoy liberando la memory que se asigna dinámicamente.

ACTUALIZAR

Actualicé mi código para usar el método @pogorskiy. Solo bash upload el marco si la salida devuelve 1 y borra el búfer una vez que termino de codificar los frameworks de video.