17

iPad2の前面カメラと背面カメラのストリームを2つのUIViewに並べて表示したいと思います。1つのデバイスの画像をストリーミングするには、次のコードを使用します

AVCaptureDeviceInput *captureInputFront = [AVCaptureDeviceInput deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] error:nil];

AVCaptureSession *session = [[AVCaptureSession alloc] init];
session addInput:captureInputFront];
session setSessionPreset:AVCaptureSessionPresetMedium];
session startRunning];

AVCaptureVideoPreviewLayer *prevLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
prevLayer.frame = self.view.frame;
[self.view.layer addSublayer:prevLayer];

これはどちらのカメラでも問題なく動作します。ストリームを並行して表示するために、別のセッションを作成しようとしましたが、2番目のセッションが確立されるとすぐに、最初のセッションがフリーズします。

次に、セッションに2つのAVCaptureDeviceInputを追加しようとしましたが、現時点では最大で1つの入力がサポートされているようです。

両方のカメラからストリーミングする方法について役立つアイデアはありますか?

4

1 に答える 1

23

MacOS X では、複数のビデオ デバイスから を取得できます。オブジェクトを手動でセットアップする必要あります。たとえば、次のオブジェクトがあるとします。CMSampleBufferRefAVCaptureConnection

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

次のような出力を追加しないでください。

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

代わりに、それらを追加して、セッションに接続を行わないように指示します。

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

次に、入力/出力ペアごとに、入力のビデオ ポートから出力への接続を手動で行います。

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

最後に、両方の出力にサンプル バッファー デリゲートを設定してください。

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

これで、両方のデバイスからのフレームを処理できるようになります。

- (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
    }
}

複数のビデオ デバイスからのライブ プレビューを結合する例については、 AVVideoWall サンプル プロジェクトも参照してください。

于 2015-05-12T12:33:18.087 に答える