3

Use Case: Я хочу захватить ввод с камеры, нарисовать поверх захваченных кадров (и звука) и сохранить результат в виде файла .mov.Изменить AVCaptureSession перед сохранением с помощью AVCaptureMovieFileOutput

  • Я вижу, что я могу записывать входные данные для камеры, используя AVCaptureSession.
  • Я могу сохранить это в файле .mov, используя AVCaptureMovieFileOutput.
  • AVVideoComposition может использоваться для добавления Core Animation для воспроизведения. Думаю, для записи так или иначе?

Проблема: Я не могу видеть, как изменить вход, прежде чем он будет сохранен в файл.

ответ

5

RosyWriter почти делал то, что хотел. Добавление следующего кода в captureOutput: didOutputSampleBuffer: fromConnection: позволило мне рисовать рамку с помощью Quartz.

CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

    CVPixelBufferLockBaseAddress(pixelBuffer, 0); 
    void *pxdata = CVPixelBufferGetBaseAddress(pixelBuffer); 
    NSParameterAssert(pxdata != NULL); 

    CGSize frameSize = CGSizeMake(self.videoDimensions.width, self.videoDimensions.height); 

    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width, 
               frameSize.height, 8, 4*frameSize.width, rgbColorSpace, 
               kCGImageAlphaNoneSkipFirst); 

    CGContextMoveToPoint(context, 100, 100); 
    CGContextAddLineToPoint(context, 200, 200); 
    CGContextDrawPath(context, kCGPathStroke); 

    CGColorSpaceRelease(rgbColorSpace); 
    CGContextRelease(context); 
0

AVCaptureMovieFileOutput не позволяет обрабатывать захваченные кадры. Для этого замените его на AVCaptureVideoDataOutput и закодируйте ввод в файл .mov, используя AVAssetWriter.

Что касается AVVideoComposition, думаю, вам, возможно, придется применить его в отдельном проходе с помощью AVAssetExportSession.

Смежные вопросы