AVAudioPlayer breaking video recording?

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

  1. lunadiviner
    Expand Collapse
    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