-1

我在我的应用程序中创建了一个类似“镜子”的视图,它使用前置摄像头向用户显示“镜子”。我遇到的问题是我已经好几周没有接触过这段代码了(当时它确实有效),但现在我再次对其进行测试,但它不起作用。代码和之前一样,没有报错,storyboard中的view和之前一模一样。我不知道发生了什么,所以我希望这个网站会有所帮助。

这是我的代码:

if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]) {
        //If the front camera is available, show the camera


        AVCaptureSession *session = [[AVCaptureSession alloc] init];
        AVCaptureOutput *output = [[AVCaptureStillImageOutput alloc] init];
        [session addOutput:output];

        //Setup camera input
        NSArray *possibleDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
        //You could check for front or back camera here, but for simplicity just grab the first device
        AVCaptureDevice *device = [possibleDevices objectAtIndex:1];
        NSError *error = nil;
        // create an input and add it to the session
        AVCaptureDeviceInput* input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; //Handle errors

        //set the session preset
        session.sessionPreset = AVCaptureSessionPresetHigh; //Or other preset supported by the input device
        [session addInput:input];

        AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
        //Now you can add this layer to a view of your view controller
        [cameraView.layer addSublayer:previewLayer];
        previewLayer.frame = self.cameraView.bounds;
        [session startRunning];
        if ([session isRunning]) {
            NSLog(@"The session is running");
        }
        if ([session isInterrupted]) {
            NSLog(@"The session has been interupted");
        }

    } else {
        //Tell the user they don't have a front facing camera
    }

提前谢谢你。

4

1 回答 1

5

不确定这是否是问题,但您的代码和注释之间存在不一致。不一致之处在于以下代码行:

AVCaptureDevice *device = [possibleDevices objectAtIndex:1];

在上面的评论中它说:“......为简单起见,只需抓住第一个设备”。但是,代码正在抓取第二个设备,NSArray从 0 开始索引。我认为应该更正注释,因为我认为您假设前置摄像头将是阵列中的第二个设备。

如果您假设第一个设备是后置摄像头,第二个设备是前置摄像头,那么这是一个危险的假设。possibleDevices检查前置摄像头设备的列表会更安全,也更适合未来。

以下代码将枚举列表possibleDevicesinput使用前置摄像头创建。

// Find the front camera and create an input and add it to the session
AVCaptureDeviceInput* input = nil;

for(AVCaptureDevice *device in possibleDevices) {
    if ([device position] == AVCaptureDevicePositionFront) {
        NSError *error = nil;

        input = [AVCaptureDeviceInput deviceInputWithDevice:device 
                                                      error:&error]; //Handle errors
        break;
    }
}

更新:我刚刚将问题中的代码完全剪切并粘贴到一个简单的项目中,它对我来说工作正常。我正在观看来自前置摄像头的视频。您可能应该在其他地方寻找问题。首先,我倾向于检查cameraView相关层。

于 2012-09-17T05:50:24.913 回答