【问题标题】:AVCaptureMovieFileOutput - no active/enabled connectionsAVCaptureMovieFileOutput - 没有活动/启用的连接
【发布时间】:2014-03-01 06:15:52
【问题描述】:

我正在尝试使用 AVFoundation 在我的 iPhone 应用程序中录制视频。 但是每当我单击“录制”按钮时,应用程序就会崩溃并显示此消息

-[AVCaptureMovieFileOutput startRecordingToOutputFileURL:recordingDelegate:] - 没有激活/启用 连接。

我知道在 SO 中提出了同样的问题,但没有一个答案对我有帮助。 我的问题是相同的代码可以完美地与另一个应用程序一起使用,当我尝试在这个应用程序中使用完全相同的代码时 - 崩溃。但仍然可以正常拍摄照片。

在这里添加我的代码 - 请帮助我,在此先感谢

  -(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];
     }
     ];
    }

  }

【问题讨论】:

  • 嗨 - 你有没有想过这个问题?我也有类似的问题。
  • 找到什么了吗?请分享?

标签: ios objective-c video avfoundation avcapturesession


【解决方案1】:

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

_session.sessionPreset = AVCaptureSessionPresetHigh;

它对我有用! :)

【讨论】:

  • 我正在尝试类似的,你能看看我的问题:[stackoverflow.com/questions/44860899/…
  • 我试过了,但没有用。你知道不设置预设的方法吗?有时你需要像 Apple 建议的那样直接设置 activeFormat。
  • 例如,当您尝试捕获前置摄像头时,这可能是一个非常重要的问题。谢谢,为我工作!
【解决方案2】:

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

  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);
}

希望对你有帮助

【讨论】:

  • 如何同时添加多个输出。添加多个输出时它的崩溃应用程序。 @iGranDav
  • @AlizainPrasla 我没有在最新的 SDK 上测试这段代码。此特定代码在 SDK 10 / Xcode 8.2.1 上崩溃?
  • @iGravDav 完全正确
【解决方案3】:

因为目前您没有将视频录制到文件的活动连接。
在记录到输出文件之前检查连接活动状态:

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)。然后您可以将视频录制到输出文件。

【讨论】:

  • 更改 sessionPreset 属性已修复它。我将其设置为 AVCaptureSessionPresetPhoto 而不是 AVCaptureSessionPresetHigh。谢谢。
  • 你知道不设置预设的方法吗?有时你需要像 Apple 建议的那样直接设置 activeFormat。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2021-08-20
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    相关资源
    最近更新 更多