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



我知道在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];
     }
     ];
    }

  }

最佳答案

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

_session.sessionPreset = AVCaptureSessionPresetHigh;

它为我工作! :)

关于ios - AVCaptureMovieFileOutput-没有事件/启用的连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22110911/

10-09 09:57