我正在尝试使用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/