Ответ 1
можно получить CMSampleBufferRef
с нескольких видеоустройств на MacOS X. Вам нужно настроить объекты AVCaptureConnection
вручную. Например, если у вас есть эти объекты:
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 sample для примера объединения прямых трансляций из нескольких видеоустройств.