在使用 AVCaptureMovieFileOutput 保存之前修改 AVCaptureSession

Posted

技术标签:

【中文标题】在使用 AVCaptureMovieFileOutput 保存之前修改 AVCaptureSession【英文标题】:Modify AVCaptureSession before saving with AVCaptureMovieFileOutput 【发布时间】:2012-06-22 15:55:52 【问题描述】:

用例:我想捕获来自相机的输入,在捕获的帧(和声音)之上绘制并将结果保存为 .mov 文件。

我发现我可以使用 AVCaptureSession 为摄像头捕获输入。 我可以使用 AVCaptureMovieFileOutput 将其保存到 .mov 文件中。 AVVideoComposition 可用于添加核心动画以进行播放。我也想以某种方式录制?

问题:在将输入保存到文件之前,我看不到如何修改它。

【问题讨论】:

【参考方案1】:

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);

【讨论】:

【参考方案2】:

AVCaptureMovieFileOutput 不允许您处理捕获的帧。为此,请将其替换为 AVCaptureVideoDataOutput,并使用 AVAssetWriter 将输入编码为 .mov 文件。

至于AVVideoComposition,我认为您可能需要使用AVAssetExportSession 在单独的通道中应用它。

【讨论】:

以上是关于在使用 AVCaptureMovieFileOutput 保存之前修改 AVCaptureSession的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 unicode 时我不能在 :before :after 内容之后使用空格

在哪里使用 callable 以及在哪里使用 Runnable Interface?

在 Observable RxSwift 中使用 'asPromise()' 可以在 PromiseKit Promise 中使用吗?

可以在 SELECT 查询中使用 IF() 但不能在 UPDATE 中使用

使用 React,在使用 react-transition-group 时,在 StrictMode 中不推荐使用 findDOMNode 作为警告

在本地为 Django 使用 SQLite,在服务器上使用 Postgres