2012-08-02 57 views
0

在我的應用程序的意見之一有一個按鈕。按下時,它應該開始拍攝視頻,觸發聲音文件啓動,並隱藏自己的視野,同時取消隱藏另一個按鈕。第二個按鈕應該停止視頻錄製並保存。下面的代碼我有錄像,最初沒有問題的工作:AVAudioPlayer打破視頻捕獲

在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 - 輸入」和「didFinishRecordingToOutputFileAtURL - 成功」日誌,現在當我按下開始按鈕時我會得到第一個日誌,當按下完成按鈕,並且不記錄視頻。如果我將歌曲播放出來的線條評論出來,那麼視頻捕獲工作就會很好。任何想法發生了什麼?

回答

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> 
+0

我應該導入哪個框架? – lunadiviner 2012-08-03 05:12:12

+0

AudioToolbox.Framework – 2012-08-04 09:01:12

+0

工作完美,謝謝! – lunadiviner 2012-08-06 18:22:52