SHARE
TWEET

Untitled

a guest Jun 14th, 2012 43 Never
  1. Hold multiple Frames in Memory before sending them to AVAssetWriter
  2. - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection
  3. {      
  4.     //...
  5.     CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
  6.     uint8 *baseAddress = (uint8*)CVPixelBufferGetBaseAddress(imageBuffer);
  7.     NSData *rawFrame = [[NSData alloc] initWithBytes:(void*)baseAddress length:(height * bytesPerRow)];
  8.     [m_frameDataArray addObject:rawFrame];
  9.     [rawFrame release];
  10.     //...
  11. }
  12.        
  13. -(void)writeFramesToFile
  14. {
  15.     //...
  16.     NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
  17.                                     [NSNumber numberWithInt:640], AVVideoWidthKey,
  18.                                     [NSNumber numberWithInt:480], AVVideoHeightKey,
  19.                                     AVVideoCodecH264, AVVideoCodecKey,
  20.                                     nil ];
  21.     AVAssetWriterInput *bufferAssetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings];
  22.     AVAssetWriter *bufferAssetWriter = [[AVAssetWriter alloc]initWithURL:pathURL fileType:AVFileTypeQuickTimeMovie error:&error];
  23.     [bufferAssetWriter addInput:bufferAssetWriterInput];
  24.  
  25.     [bufferAssetWriter startWriting];
  26.     [bufferAssetWriter startSessionAtSourceTime:startTime];
  27.     for (NSInteger i = 1; i < m_frameDataArray.count; i++){
  28.         NSData *rawFrame = [m_frameDataArray objectAtIndex:i];
  29.         CVImageBufferRef imgBuf = [rawFrame bytes];
  30.         [pixelBufferAdaptor appendPixelBuffer:imgBuf withPresentationTime:CMTimeMake(1,10)]; //<-- EXC_BAD_ACCESS
  31.         [rawFrame release];
  32.     }
  33.     //... (finishing video file)
  34. }
  35.        
  36. CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
  37. CVPixelBufferLockBaseAddress(imageBuffer, 0);
  38. uint8 *baseAddress = (uint8*)CVPixelBufferGetBaseAddress(imageBuffer);
  39. NSData *rawFrame = [[NSData alloc] initWithBytes:(void*)baseAddress length:(height * bytesPerRow)];
  40. [m_frameDataArray addObject:rawFrame];
  41. CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
RAW Paste Data
Top