具有多个输出的AVCaptureSession?

时间:2011-11-09 00:17:54

标签: ios avfoundation avcapturesession

我目前正在开发一款iOS应用程序,它将CoreImage应用于相机Feed以拍摄照片和视频,而且我遇到了一些障碍。

到目前为止,我一直在使用 AVCaptureVideoDataOutput 来获取样本缓冲区并使用CoreImage对其进行操作,然后显示简单的预览,并使用它来捕获照片并保存它们。

当我尝试实现视频录制时,将SampleBuffers写入视频,因为我从 AVCaptureVideoDataOutput 接收视频时,它的帧速率非常慢(可能是因为其他图像与处理有关)正在进行中。)

所以我想知道,是否有可能同时在同一个AVCaptureSession上运行 AVCaptureVideoDataOutput 和AVCaptureMoveFileOutput?

我快速给了它,发现当我添加额外输出时,我的AVCaptureVideoDataOutput停止接收信息。

如果我能让它工作,我希望这意味着我可以简单地使用第二个输出以高帧率录制视频,并在用户停止录制后对视频进行后处理。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

这比你想象的容易。

请参阅:AVCamDemo

  1. 使用AVCaptureVideoDataOutput捕获数据。
  2. 录制前创建新的调度队列,例如。 recordingQueue:recordingQueue = dispatch_queue_create("Movie Recording Queue", DISPATCH_QUEUE_SERIAL);
  3. 在captureOutput:didOutputSampleBuffer:fromConnection:delegate中     方法,捕获samplebuffer,保留它,并在录音中     队列,将其写入文件:

    -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {    
    
        CFRetain(sampleBuffer);
    
        dispatch_async(recordingQueue, ^{
    
            if (assetWriter) {
    
                if (connection == videoConnection) {
                    [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo];
                } else if (connection == audioConnection) {
                    [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeAudio];
                }
    
            }
    
            CFRelease(sampleBuffer);        
        });
    }
    
        - (void) writeSampleBuffer:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType
        {
            CMTime presentationTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
    
            if ( assetWriter.status == AVAssetWriterStatusUnknown ) {
    
                if ([assetWriter startWriting]) {
                    [assetWriter startSessionAtSourceTime:presentationTime];
                } else {
                    NSLog(@"Error writing initial buffer");
                }
            }
    
            if ( assetWriter.status == AVAssetWriterStatusWriting ) {
    
                if (mediaType == AVMediaTypeVideo) {
                    if (assetWriterVideoIn.readyForMoreMediaData) {
    
                        if (![assetWriterVideoIn appendSampleBuffer:sampleBuffer]) {
                            NSLog(@"Error writing video buffer");
                        }
                    }
                }
                else if (mediaType == AVMediaTypeAudio) {
                    if (assetWriterAudioIn.readyForMoreMediaData) {
    
                        if (![assetWriterAudioIn appendSampleBuffer:sampleBuffer]) {
                            NSLog(@"Error writing audio buffer");
                        }
                    }
                }
            }
        }