AVCaptureMovieFileOutput – 没有活动/启用的连接

我正在尝试使用AVFoundation在我的iPhone应用程序中录制video。 但每当我点击“录制”按钮时,应用程序都会崩溃

– [AVCaptureMovieFileOutput startRecordingToOutputFileURL:recordingDelegate:] – 没有活动/启用的连接。

我知道同样的问题,但是它的答案都没有帮助我。 我的问题是相同的代码完全适用于另一个应用程序,当我尝试在这个应用程序中使用完全相同的代码 – 崩溃。 但仍然照片捕捉工作正常。

在这里添加我的代码 – 请帮助我,提前致谢

-(void)viewDidLoad { [super viewDidLoad]; self.captureSession = [[AVCaptureSession alloc] init]; AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil]; self.audioInput = [[AVCaptureDeviceInput alloc] initWithDevice:audioDevice error:nil]; self.stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; NSDictionary *stillImageOutputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil]; [self.stillImageOutput setOutputSettings:stillImageOutputSettings]; self.movieOutput = [[AVCaptureMovieFileOutput alloc] init]; [self.captureSession addInput:self.videoInput]; [self.captureSession addOutput:self.stillImageOutput]; previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession]; UIView *aView = self.view; previewLayer.frame = CGRectMake(70, 190, 270, 270); [aView.layer addSublayer:previewLayer]; } -(NSURL *) tempFileURL { NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"]; NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath]; NSFileManager *manager = [[NSFileManager alloc] init]; if ([manager fileExistsAtPath:outputPath]) { [manager removeItemAtPath:outputPath error:nil]; } return outputURL; } -(IBAction)capture:(id)sender { if (self.movieOutput.isRecording == YES) { [self.movieOutput stopRecording]; } else { [self.movieOutput startRecordingToOutputFileURL:[self tempFileURL] recordingDelegate:self]; } } -(void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { BOOL recordedSuccessfully = YES; if ([error code] != noErr) { id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessfullyFinishedKey]; if (value) recordedSuccessfully = [value boolValue]; NSLog(@"A problem occurred while recording: %@", error); } if (recordedSuccessfully) { ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library writeVideoAtPathToSavedPhotosAlbum:outputFileURL completionBlock:^(NSURL *assetURL, NSError *error) { UIAlertView *alert; if (!error) { alert = [[UIAlertView alloc] initWithTitle:@"Video Saved" message:@"The movie was successfully saved to you photos library" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; } else { alert = [[UIAlertView alloc] initWithTitle:@"Error Saving Video" message:@"The movie was not saved to you photos library" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; } [alert show]; } ]; } } 

因为目前您没有活动连接来录制video到文件。
在录制到输出文件之前检查连接活动状态:

 AVCaptureConnection *c = [self.movieOutput connectionWithMediaType:AVMediaTypeVideo]; if (c.active) { //connection is active } else { //connection is not active //try to change self.captureSession.sessionPreset, //or change videoDevice.activeFormat } 

如果连接未激活,请尝试更改captureSession.sessionPreset或videoDevice.activeFormat。
重复,直到您设置了有效的格式(这意味着c.active == YES)。 然后,您可以将video录制到输出文件。

我在更改videoDevice activeFormat时遇到了同样的问题,之后想要录制video。 因为我使用的是最优质的video,所以我必须将sessionPreset设置为高,如下所示

_session.sessionPreset = AVCaptureSessionPresetHigh;

它对我有用! 🙂

您的代码中缺少一些内容:

  1. 您忘了将movieOutput添加到captureSession
  2. 您的audioInput
  3. 所有会话配置都需要通过[_captureSession beginConfiguration][_captureSession commitConfiguration]封装
  4. 对于录音,您需要将AVAudioSession设置为正确的类别。

这是您更新的代码:

 - (void)viewDidLoad { [super viewDidLoad]; NSError *error = nil; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&error]; if(!error) { [[AVAudioSession sharedInstance] setActive:YES error:&error]; if(error) NSLog(@"Error while activating AudioSession : %@", error); } else { NSLog(@"Error while setting category of AudioSession : %@", error); } self.captureSession = [[AVCaptureSession alloc] init]; AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil]; self.audioInput = [[AVCaptureDeviceInput alloc] initWithDevice:audioDevice error:nil]; self.stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; NSDictionary *stillImageOutputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil]; [self.stillImageOutput setOutputSettings:stillImageOutputSettings]; self.movieOutput = [[AVCaptureMovieFileOutput alloc] init]; [self.captureSession beginConfiguration]; [self.captureSession addInput:self.videoInput]; [self.captureSession addInput:self.audioInput]; [self.captureSession addOutput:self.movieOutput]; [self.captureSession addOutput:self.stillImageOutput]; [self.captureSession commitConfiguration]; AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession]; previewLayer.frame = CGRectMake(0, 0, 320, 500); [self.view.layer addSublayer:previewLayer]; [self.captureSession startRunning]; } - (IBAction)toggleRecording:(id)sender { if(!self.movieOutput.isRecording) { [self.recordButton setTitle:@"Stop" forState:UIControlStateNormal]; NSString *outputPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"output.mp4"]; NSFileManager *manager = [[NSFileManager alloc] init]; if ([manager fileExistsAtPath:outputPath]) { [manager removeItemAtPath:outputPath error:nil]; } [self.movieOutput startRecordingToOutputFileURL:[NSURL fileURLWithPath:outputPath] recordingDelegate:self]; } else { [self.recordButton setTitle:@"Start recording" forState:UIControlStateNormal]; [self.movieOutput stopRecording]; } } - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { NSLog(@"Did finish recording, error %@ | path %@ | connections %@", error, [outputFileURL absoluteString], connections); } 

希望这可以帮助

我找到了这个错误的原因。 检查你的会话的“setSessionPreset”设置,照片的分辨率设置与video不同,对于iPhone5,后置摄像头的video分辨率为1920 * 1080,前置摄像头为1280 * 720,照片的最大分辨率为3264 * 2488,所以如果你将错误分辨率设置为video,连接将不会被激活。