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中的双摄像头输出的主要内容,如果未能解决你的问题,请参考以下文章

iOS学习笔记27-摄像头

iOS换摄像头中的OpenCV视频处理

如何在 PWA (React) 中访问 ios 中的摄像头和耳机

iOS 11.3通过getUserMedia和黑屏进行摄像头访问

avplayer 不播放通过 IOS Objective-C 中的设备摄像头捕获的视频中的音频

iOS开发笔记17:自定义相机拍照