gpt4 book ai didi

ios - 具有多个输出的 AVCaptureSession?

转载 作者:IT王子 更新时间:2023-10-29 08:04:05 24 4
gpt4 key购买 nike

我目前正在开发一个 iOS 应用程序,该应用程序将 CoreImage 应用于相机源以拍摄照片和视频,但我遇到了一些障碍。

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

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

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

我试了一下,发现当我添加额外的输出时,我的 AVCaptureVideoDataOutput 停止接收信息。

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

任何帮助将不胜感激。

最佳答案

这比您想象的要容易。

参见:AVCamDemo

  1. 使用 AVCaptureVideoDataOutput 捕获数据。
  2. 在录制之前创建一个新的调度队列,例如。录音队列:录音队列=
    dispatch_queue_create("电影录制队列",
    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");
    }
    }
    }
    }
    }

关于ios - 具有多个输出的 AVCaptureSession?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8058891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com