iOS中的双摄像头输出
Posted
技术标签:
【中文标题】iOS中的双摄像头输出【英文标题】:Double camera output in iOS 【发布时间】:2012-01-04 08:53:22 【问题描述】:我想在 ios 上使用内置摄像头制作双屏
我尝试了以下代码,但它只显示一个视图。
这是自然的结果,我知道。
这是我使用的代码..
- (void)prepareCameraView:(UIView *)window
AVCaptureSession *session = [[AVCaptureSession alloc] init];
session.sessionPreset = AVCaptureSessionPresetMedium;
CALayer *viewLayer = window.layer;
NSLog(@"viewLayer = %@", viewLayer);
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc]
initWithSession:session];
captureVideoPreviewLayer.frame = window.bounds;
[window.layer addSublayer:captureVideoPreviewLayer];
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
if (!input)
NSLog(@"ERROR : trying to open camera : %@", error);
[session addInput:input];
[session startRunning];
如何在 iOS 上实现双屏?
【问题讨论】:
为什么不能在 iOS 中使用相机叠加视图功能 ***.com/questions/16543075/…的可能重复 【参考方案1】: // Use this code
AVCaptureSession *session = [AVCaptureSession new];
AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error;
AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&error];
if ( [session canAddInput:deviceInput])
[session addInput:deviceInput];
AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[previewLayer setFrame:CGRectMake(0.0, 0.0, self.view.bounds.size.width, self.view.bounds.size.height)];
NSUInteger replicatorInstances = 2;
CGFloat replicatorViewHeight = (self.view.bounds.size.height - 64)/replicatorInstances;
CAReplicatorLayer *replicatorLayer = [CAReplicatorLayer layer];
replicatorLayer.frame = CGRectMake(0, 0.0, self.view.bounds.size.width, replicatorViewHeight);
replicatorLayer.instanceCount = replicatorInstances;
replicatorLayer.instanceTransform = CATransform3DMakeTranslation(0.0, replicatorViewHeight, 0.0);
[replicatorLayer addSublayer:previewLayer];
[self.view.layer addSublayer:replicatorLayer];
[session startRunning];
【讨论】:
【参考方案2】:试试这个:
- (void)prepareCameraView:(UIView *)window
NSArray *captureDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
AVCaptureSession *session = [[AVCaptureSession alloc] init];
session.sessionPreset = AVCaptureSessionPresetMedium;
CALayer *viewLayer = window.layer;
NSLog(@"viewLayer = %@", viewLayer);
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
captureVideoPreviewLayer.frame = CGRectMake(0.0f, 0.0f, window.bounds.size.width/2.0f, window.bounds.size.height);
[window.layer addSublayer:captureVideoPreviewLayer];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:[captureDevices objectAtIndex:0] error:&error];
if (!input)
NSLog(@"ERROR : trying to open camera : %@", error);
[session addInput:input];
[session startRunning];
AVCaptureSession *session = [[AVCaptureSession alloc] init];
session.sessionPreset = AVCaptureSessionPresetMedium;
CALayer *viewLayer = window.layer;
NSLog(@"viewLayer = %@", viewLayer);
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
captureVideoPreviewLayer.frame = CGRectMake(window.bounds.size.width/2.0f, 0.0f, window.bounds.size.width/2.0f, window.bounds.size.height);
[window.layer addSublayer:captureVideoPreviewLayer];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:[captureDevices objectAtIndex:1] error:&error];
if (!input)
NSLog(@"ERROR : trying to open camera : %@", error);
[session addInput:input];
[session startRunning];
请注意,它绝对不会检查实际上有 2 个摄像头,而是将其垂直拆分,因此这可能最好在横向观看。您需要在该代码中添加一些检查,并在使用之前准确计算出您希望如何布置每个相机的图层。
【讨论】:
如果您运行此代码,您的第一个会话将立即被您的第二个会话中断(假设您的第二个会话甚至允许您开始添加输入)。此外,此代码不会编译。 它为我编译。第一个会话立即被中断是什么意思?你确定吗?老实说,我实际上并没有正确尝试过,但我不明白为什么它不起作用。 它会为您编译,因为您进行了编辑,所以它会 :p 是的,我敢肯定。您不能同时运行两个视频捕获会话。第一个会收到中断通知,或者第二个将无法启动,具体取决于 mediaserverd 决定对您做什么。 FaceTime 应用不显示两个视频捕获会话。它将停止会话,更改输入,然后重新启动。抱歉,我认为 2 次会议会奏效,我本可以发誓我以前做过,但显然没有! @J.KJeon FaceTime 应用不会同时从两个摄像头拍摄视频。它从一个或另一个获取视频并使用单个会话并管理多个输入(但是,一次只有一个来自设备上的摄像头的视频流可以工作)。另一个图像是来自另一个设备的叠加视频流,这是可行的。我建议您以马特的回答为起点。只需阅读 AVFoundation 的内容,您就可以获得大部分内容。我建议你也看看 AVCaptureVideoDataOutput 类......它有链接到体面的示例代码。以上是关于iOS中的双摄像头输出的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PWA (React) 中访问 ios 中的摄像头和耳机
iOS 11.3通过getUserMedia和黑屏进行摄像头访问