AVAudioPlayer打破视频捕捉

时间:2012-08-02 21:05:14

标签: objective-c ios video avfoundation

在我的应用程序的一个视图中,有一个按钮。按下时,它应该开始拍摄视频,触发声音文件以启动,并在取消隐藏另一个按钮时将自己隐藏起来。第二个按钮应该停止视频录制并保存。这是我录制的视频录制代码,最初没有问题:

在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];

和按钮:

-(IBAction)start:(id)sender
{
startButton.hidden = TRUE;
finishButton.hidden = FALSE;


//Create temporary URL to record to
NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"];
self.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];

最后,在最后一个按钮下:

[movieFileOutput stopRecording];

这是保存视频的代码:

- (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)
             {

             }
         }];
    }

}
}

所有这一切都很好。然后我添加了几行,以便在按下开始按钮时播放歌曲文件。

在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];

并在开始按钮下:

if (player == nil)
NSLog(@"Audio file could not be played");
else
[player play];

现在,当按下开始按钮时,歌曲播放没有任何问题,但视频捕捉混乱了。在添加AVAudioPlayer的东西之前,当我按下完成按钮时,我会得到“didFinishRecordingToOutputFileAtURL - enter”和“didFinishRecordingToOutputFileAtURL - success”日志,现在当我按下开始按钮时我得到第一个日志,当我按下按钮时没有任何反应完成按钮,不记录任何视频。如果我注释掉播放歌曲的行,那么视频捕捉再次正常工作。有什么想法在这里发生了什么?

1 个答案:

答案 0 :(得分:2)

- (void)setupAudioSession 
{
    static BOOL audioSessionSetup = NO;

    if (audioSessionSetup)
    {
        return;   
    }

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error: nil];
    UInt32 doSetProperty = 1;

    AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);

    [[AVAudioSession sharedInstance] setActive: YES error: nil];

    audioSessionSetup = YES;
}

- (void)playAudio
{
    [self setupAudioSession];

    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"btnClick" ofType:@"wav"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];
    AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
    [fileURL release];

    self.audioPlayer = newPlayer;
    [newPlayer release];

    [audioPlayer setDelegate:self];
    [audioPlayer prepareToPlay];
    audioPlayer.volume=1.0;
    [audioPlayer play];
}

注意:添加框架:AudioToolbox.framework。

#import <AudioToolbox/AudioServices.h>