Run multiple AVCaptureSessions or add multiple inputs

前端 未结 1 1745
夕颜
夕颜 2020-12-14 02:47

I want to display the stream of the front and the back facing camera of an iPad2 in two UIViews next to each other. To stream the image of one device I use the following cod

相关标签:
1条回答
  • 2020-12-14 03:38

    It is possible to get CMSampleBufferRefs from multiple video devices on MacOS X. You have to setup the AVCaptureConnection objects manually. For example, assuming you have these objects:

    AVCaptureSession *session;
    AVCaptureInput *videoInput1;
    AVCaptureInput *videoInput2;
    AVCaptureVideoDataOutput *videoOutput1;
    AVCaptureVideoDataOutput *videoOutput2;
    

    Do NOT add the outputs like this:

    [session addOutput:videoOutput1];
    [session addOutput:videoOutput2];
    

    Instead, add them and tell the session not to make any connections:

    [session addOutputWithNoConnections:videoOutput1];
    [session addOutputWithNoConnections:videoOutput2];
    

    Then for each input/output pair make the connection from the input's video port to the output manually:

    for (AVCaptureInputPort *port in [videoInput1 ports]) {
        if ([[port mediaType] isEqualToString:AVMediaTypeVideo]) {
            AVCaptureConnection* cxn = [AVCaptureConnection
                connectionWithInputPorts:[NSArray arrayWithObject:port]
                output:videoOutput1
            ];
            if ([session canAddConnection:cxn]) {
                [session addConnection:cxn];
            }
            break;
        }
    }
    

    Finally, make sure to set sample buffer delegates for both outputs:

    [videoOutput1 setSampleBufferDelegate:self queue:someDispatchQueue];
    [videoOutput2 setSampleBufferDelegate:self queue:someDispatchQueue];
    

    and now you should be able to process frames from both devices:

    - (void)captureOutput:(AVCaptureOutput *)captureOutput
    didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
           fromConnection:(AVCaptureConnection *)connection
    {
        if (captureOutput == videoOutput1)
        {
            // handle frames from first device
        }
        else if (captureOutput == videoOutput2)
        {
            // handle frames from second device
        }
    }
    

    See also the AVVideoWall sample project for an example of combining live previews from multiple video devices.

    0 讨论(0)
提交回复
热议问题