AVAudioPlayer breaking video recording?

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

  1. lunadiviner macrumors newbie

    Jul 19, 2012
    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:

    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:

    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:

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

    - (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:

    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:

    if (player == nil)
    NSLog(@"Audio file could not be played");
    [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