AVCapture appendSampleBuffer

Я схожу с ума от этого - искал везде и пробовал все, что мог придумать.

Я делаю приложение для iPhone, которое использует AVFoundation, в частности AVCapture, для захвата видео с помощью камеры iPhone.

Мне нужно иметь собственное изображение, которое накладывается на видеопоток, включенный в запись.

Пока что у меня настроен сеанс AVCapture, может отображать ленту, обращаться к кадру, сохранять его как UIImage и накладывать на него наложенное изображение. Затем преобразуйте этот новый UIImage в CVPixelBufferRef. annnd, чтобы дважды проверить, работает ли bufferRef. Я преобразовал его обратно в UIImage, и изображение все еще отображается нормально.

Проблема начинается, когда я пытаюсь преобразовать CVPixelBufferRef в CMSampleBufferRef, чтобы добавить его к AVCaptureSessions assetWriterInput. CMSampleBufferRef всегда возвращает NULL, когда я пытаюсь его создать.

Вот функция - (void) captureOutput

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
    fromConnection:(AVCaptureConnection *)connection
{ 

 UIImage *botImage = [self imageFromSampleBuffer:sampleBuffer];
 UIImage *wheel = [self imageFromView:wheelView];

 UIImage *finalImage = [self overlaidImage:botImage :wheel];
 //[previewImage setImage:finalImage]; <- works -- the image is being merged into one UIImage

 CVPixelBufferRef pixelBuffer = NULL;
 CGImageRef cgImage = CGImageCreateCopy(finalImage.CGImage);
 CFDataRef image = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
 int status = CVPixelBufferCreateWithBytes(NULL,
             self.view.bounds.size.width,
             self.view.bounds.size.height,
             kCVPixelFormatType_32BGRA, 
             (void*)CFDataGetBytePtr(image), 
             CGImageGetBytesPerRow(cgImage), 
             NULL, 
             0,
             NULL, 
             &pixelBuffer);
 if(status == 0){
  OSStatus result = 0;

  CMVideoFormatDescriptionRef videoInfo = NULL;
  result = CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBuffer, &videoInfo);
  NSParameterAssert(result == 0 && videoInfo != NULL);

  CMSampleBufferRef myBuffer = NULL;
  result = CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault,
            pixelBuffer, true, NULL, NULL, videoInfo, NULL, &myBuffer);
  NSParameterAssert(result == 0 && myBuffer != NULL);//always null :S

  NSLog(@"Trying to append");

  if (!CMSampleBufferDataIsReady(myBuffer)){
   NSLog(@"sampleBuffer data is not ready");
   return;
  }

  if (![assetWriterInput isReadyForMoreMediaData]){
   NSLog(@"Not ready for data :(");
   return;
  }

  if (![assetWriterInput appendSampleBuffer:myBuffer]){   
   NSLog(@"Failed to append pixel buffer");
  }



 }

}

Другое решение, о котором я постоянно слышу, - это использование AVAssetWriterInputPixelBufferAdaptor, который устраняет необходимость в беспорядочной упаковке CMSampleBufferRef. Однако я просмотрел многоуровневые форумы и документы разработчиков Apple, и могу ' Я не могу найти четкое описание или пример того, как это настроить или как использовать. Если у кого-нибудь есть рабочий пример этого, не могли бы вы показать мне или помочь мне решить вышеуказанную проблему - мы работали над этим без перерыва в течение недели, и я нахожусь в состоянии ума.

Дайте мне знать, если вам понадобится что-то другое. info

Заранее спасибо,

Майкл

7
задан tc. 2 October 2010 в 15:32
поделиться