1

设想

我正在开发一个进行视频处理和流式传输的应用程序。我已经完美地从后置摄像头流式传输视频。问题是我还必须对视频数据进行处理,但只能在本地进行。事实证明,我用来进行本地视频处理的 API需要与我用来将数据流式传输到服务器的 API 不同的像素格式。看来我需要两个单独的会话同时从后置摄像头捕获视频。这将允许一个会话进行处理,一个会话用于流式传输。

问题

每次我尝试创建一个新会话以使用相同的AVCaptureDevice(返回)时,我的流媒体立即停止。下面的代码:

captureSession = [[AVCaptureSession alloc] init];

AVCaptureDeviceInput *videoIn = [[AVCaptureDeviceInput alloc]
                                 initWithDevice:[self videoDeviceWithPosition:AVCaptureDevicePositionBack]
                                 error:nil];

if ([captureSession canAddInput:videoIn])
{
    [captureSession addInput:videoIn];
}

AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];

[videoOut setAlwaysDiscardsLateVideoFrames:YES];
[videoOut setVideoSettings:
 @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)}];
dispatch_queue_t videoCaptureQueue =
dispatch_queue_create("Video Process Queue", DISPATCH_QUEUE_SERIAL);
[videoOut setSampleBufferDelegate:self queue:videoCaptureQueue];
if ([captureSession canAddOutput:videoOut]) {
    [captureSession addOutput:videoOut];
}

我收到中断原因 videoDeviceInUseByAnotherClient

videoDeviceInUseByAnotherClient:由于视频设备暂时不可用(例如,当另一个捕获会话使用时)而导致的中断。

我也尝试将原始捕获会话的输出添加到新会话中,但每次canAddOutput:方法返回时NO。我的猜测是因为已经有一个与该输出关联的会话。

问题

我如何使用它同时输出AVCaptureDevice到两个单独AVCaptureVideoDataOutput的 s ?或者我怎样才能达到与下图相同的效果?

在此处输入图像描述

4

0 回答 0