我正在尝试使用AVCaptureSession制作视频录制应用程序。
我有一个UIButton,它提供了预览层并按如下所示设置了会话:

-(void) video:(UIButton*)sender
{
    session = [[AVCaptureSession alloc] init];
    session.sessionPreset = AVCaptureSessionPresetPhoto;

    captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    [captureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

    captureVideoPreviewLayer.frame = cameraView.bounds;

    [cameraView.layer addSublayer:captureVideoPreviewLayer];

    NSArray *devices = [AVCaptureDevice devices];
    AVCaptureDevice *frontCamera;
    AVCaptureDevice *backCamera;

    for (AVCaptureDevice *device in devices)
    {
        if ([device hasMediaType:AVMediaTypeVideo])
        {
            if ([device position] == AVCaptureDevicePositionBack)
                backCamera = device;
            else
                frontCamera = device;
        }
    }
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:frontCamera error:nil];
    [session addInput:input];

    movieOutput = [[AVCaptureMovieFileOutput alloc]init];
    if ([session canAddOutput:movieOutput]) {
        [session addOutput:movieOutput];
    }

    [session startRunning];
}


然后再有一个UIButton才开始记录:

-(void) record:(UIButton*)sender
{
    NSLog(@"Recording");

    outputURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    outputURL = [outputURL URLByAppendingPathComponent:@"myVideo.mov"];
    NSString *filePath = [outputURL path];

    [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
    NSLog(@"is url :: %d", [outputURL isFileURL]);
    NSLog(@"does file exists :: %d",[[NSFileManager defaultManager] fileExistsAtPath:filePath]);

    [movieOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
}


现在,我不知道为什么这段代码可以在iPad上正常工作,但是在iPhone上崩溃并引发错误:

'*** -[AVCaptureMovieFileOutput startRecordingToOutputFileURL:recordingDelegate:] - no active/enabled connections.'


我到处寻找针对此特定错误的解决方案,但是如果我的代码有问题,那么为什么它可以在iPad上运行?

注意:


我的应用是通用的。
在iPhone上,它可以很好地加载到预览层,但是在我开始录制时会崩溃。
我检查了多个iPhone,结果相同。
我确实实现了captureOutput: didFinishRecordingToOutputFileAtURL: fromConnections: error:


更新:
经过大量的反复试验后,我发现如果仅添加音频作为输入,则该应用程序在iPhone上效果很好。

AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
    AVCaptureDeviceInput * audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];
    [session addInput:audioInput];


所以问题应该出在我添加相机作为输入的方式上,尽管我没有找到任何东西。它适用于iPad。

最佳答案

经过2天的苦苦挣扎,我发现问题出在sessionPreset属性是AVCaptureSessionPresetPhoto。我通过删除它来解决它,以便它将使用其默认值。

关于ios - AVCaptureSession在iPad上可以正常工作,但在iPhone上不能正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28024114/

10-12 14:36