Enencoding YUV420P brut à h264 avec AVCodec sur iOS

J'essaye de coder une seule image YUV420P rassemblée d'un CMSampleBuffer à un AVPacket sorte que je puisse envoyer la video h264 sur le réseau avec RTMP.

L'exemple de code affiché semble fonctionner comme avcodec_encode_video2 renvoie 0 (succès) mais got_output est également 0 ( AVPacket est vide).

Quelqu'un at-il une expérience avec l'enencoding de la video sur les appareils iOS qui pourraient savoir ce que je fais 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]; } 

Remarque: Il est connu que ce code a des memory leaks car je ne libère pas la memory allouée dynamicment.

METTRE À JOUR

J'ai mis à jour mon code pour utiliser la méthode @pogorskiy. J'essaie seulement de download le cadre si la sortie est returnnée 1 et efface le tampon une fois que j'ai fini de coder les images video.