AVAudioPlayer breaking video recording?

Discussion in 'iOS Programming' started by lunadiviner, Aug 2, 2012.

  1. macrumors newbie

    Joined:
    Jul 19, 2012
    #1
    In one of the views of my app there's a button. When pressed it is supposed to begin taking a video, trigger a sound file to start, and hide itself from view while unhiding another button. The second button is supposed to stop the video recording and make it save. Here's the code I have for the video recording, which initially worked with no problems:

    in viewDidLoad:

    Code:
    finishButton.hidden = TRUE;
    
    session = [[AVCaptureSession alloc] init];
    movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
    
    
    NSError *error;
    
    AVCaptureDeviceInput *videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self cameraWithPosition:AVCaptureDevicePositionFront] error:&error];
    
    
    if (videoInput)
    {
    [session addInput:videoInput];
    }
    
    AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
    NSError *audioError = nil;
    AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&audioError];
    
    if (audioInput)
    {
    [session addInput:audioInput];
    }
    
    
    Float64 TotalSeconds = 35; //Total seconds
    int32_t preferredTimeScale = 30; //Frames per second
    CMTime maxDuration = CMTimeMakeWithSeconds(TotalSeconds, preferredTimeScale);
    movieFileOutput.maxRecordedDuration = maxDuration;
    
    movieFileOutput.minFreeDiskSpaceLimit = 1024 * 1024;
    
    if ([session canAddOutput:movieFileOutput])
    [session addOutput:movieFileOutput];
    
    [session setSessionPreset:AVCaptureSessionPresetMedium];
    if ([session canSetSessionPreset:AVCaptureSessionPreset640x480]) //Check size based configs are supported before setting them
    [session setSessionPreset:AVCaptureSessionPreset640x480];
    
    [self cameraSetOutputProperties];
    
    
    [session startRunning];
    and for the button:

    Code:
    -(IBAction)start:(id)sender
    {
    startButton.hidden = TRUE;
    finishButton.hidden = FALSE;
    
    //Create temporary URL to record to
    NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"];
    outputURL = [[NSURL alloc] initFileURLWithPath:outputPath];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:outputPath])
    {
    NSError *error;
    if ([fileManager removeItemAtPath:outputPath error:&error] == NO)
    {
    //Error - handle if required
    }
    }
    //Start recording
    [movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
    finally, under the last button:

    Code:
    [movieFileOutput stopRecording];
    and here's the code to save the video:

    Code:
    - (void)captureOutput:(AVCaptureFileOutput *)captureOutput
    didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
    fromConnections:(NSArray *)connections
    error:(NSError *)error
    {
    
    NSLog(@"didFinishRecordingToOutputFileAtURL - enter");
    
    BOOL RecordedSuccessfully = YES;
    if ([error code] != noErr)
    {
    // A problem occurred: Find out if the recording was successful.
    id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessfullyFinishedKey];
    if (value)
    {
    RecordedSuccessfully = [value boolValue];
    }
    }
    if (RecordedSuccessfully)
    {
    //----- RECORDED SUCESSFULLY -----
    NSLog(@"didFinishRecordingToOutputFileAtURL - success");
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputURL])
    {
    [library writeVideoAtPathToSavedPhotosAlbum:outputURL
    completionBlock:^(NSURL *assetURL, NSError *error)
    {
    if (error)
    {
    
    }
    }];
    }
    
    }
    }
    All of this was working just fine. Then I added a few lines so that a song file would play when the start button was pressed.

    in viewDidLoad:

    Code:
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/Song.aiff", [[NSBundle mainBundle] resourcePath]]];
    
    NSError *audioFileError;
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&audioFileError];
    player.numberOfLoops = 0;
    [self.player prepareToPlay];
    and under the start button:

    Code:
    if (player == nil)
    NSLog(@"Audio file could not be played");
    else
    [player play];
    Now when the start button is pressed the song plays with no problems, but the video capture is messed up. Before adding the AVAudioPlayer stuff I would get the "didFinishRecordingToOutputFileAtURL - enter" and "didFinishRecordingToOutputFileAtURL - success" logs when I pressed the finish button, and now I get the first log as soon as I press the start button, nothing happens when I press the finish button, and no video is recorded. If I comment out the lines that make the song play then the video capture works just fine again. Any ideas what's going on here?
     

Share This Page