2012-06-05 13 views
9

Jestem w stanie nagrać wideo i poprawnie wypisać film do pliku. Mam jednak problem z nagrywaniem wideo (brak opcji wideo) podczas próby użycia AVAudioPlayer do odtwarzania dźwięku. Czy to oznacza, że ​​nie mogę jednocześnie korzystać z AVCaptureSession i AVAudioPlayer? Oto mój kod do tworzenia sesji przechwytywania i do odtwarzania dźwięku. Przechwytywanie wideo jest uruchamiane jako pierwsze, a następnie podczas przechwytywania chcę odtwarzać dźwięk. Dziękuję bardzo za każdą pomoc.Używanie AVCaptureSession i AVAudioPlayer razem

Kod stworzyć sesję przechwytywania do nagrywania wideo (z dźwiękiem) - wyjście do pliku .mov:

- (void)addVideoInput 
    AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; 
    //... also some code for setting up videoDevice/frontCamera 
    NSError *error; 
    AVCaptureDeviceInput *videoIn = [AVCaptureDeviceInput 
    deviceInputWithDevice:frontCamera error:&error]; 
    AVCaptureDeviceInput *audioIn = [AVCaptureDeviceInput 
    deviceInputWithDevice:audioDevice error:&error]; 
    if (!error) { 
     if ([captureSession canAddInput:audioIn]) 
       [captureSession addInput:audioIn]; 
     else 
       NSLog(@"Couldn't add audio input."); 
     if ([captureSession canAddInput:videoIn]) 
       [captureSession addInput:videoIn]; 
     else 
       NSLog(@"Couldn't add video input."); 
} 
- (void)addVideoOutput 
{ 
    AVCaptureMovieFileOutput *m_captureFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 
    [captureSession addOutput:m_captureFileOutput]; 

    [captureSession startRunning]; 

    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSMutableString *filePath = [NSMutableString stringWithString:@"Movie.mov"]; 
    NSString* fileRoot = [docDir stringByAppendingPathComponent:filePath]; 
    NSURL *fileURL = [NSURL fileURLWithPath:fileRoot]; 

    AVCaptureConnection *videoConnection = NULL; 

    for (AVCaptureConnection *connection in [m_captureFileOutput connections]) 
    { 
     for (AVCaptureInputPort *port in [connection inputPorts]) 
     { 
      if ([[port mediaType] isEqual:AVMediaTypeVideo]) 
      { 
       videoConnection = connection; 

      } 
     } 
    } 

    [videoConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeRight]; 


    [m_captureFileOutput startRecordingToOutputFileURL:fileURL recordingDelegate:self]; 
    [m_captureFileOutput release]; 
} 

kod do odtwarzania audio, funkcja ta jest rozmowa w trakcie sesji przechwytywania wideo. Jeśli nie zadzwonię do tej funkcji, wideo zostanie nagrane i będę mógł zapisać plik .mov. Jeśli jednak zadzwonię do tej funkcji, nie ma wyjściowego pliku .mov.

- (void)playAudio 
{ 
    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"AudioFile" ofType:@"mp3"]; 
    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 play]; 
} 

Odpowiedz

19

Naprawiłem problem, konfigurując sesję audio. Wywołałem następującą funkcję przed utworzeniem obiektu odtwarzacza audio, aby odtworzyć dźwięk. W ten sposób mogłem nagrywać wideo (z dźwiękiem) i odtwarzać dźwięk w tym samym czasie.

- (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:@"AudioFile" ofType:@"mp3"]; 
     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 play]; 
    } 
+0

Witaj HappyAppDeveloper, utknąłem na tym samym problemie. Robię to samo, co w tej samej inicjalizacji w setupAudioSession, ale sesja przechwytywania zawsze się zatrzymuje. Czy wiesz, czy to się nie udało na iOS6? – kungfoo

+0

działa idealnie na iOS 5 i 6! Uratowałem mój bekon, dzięki !!!!!!!!!!! – SpaceDog

+0

Jeśli używasz ARC, odtwarzacz audio musi być uznany za "silny". W przeciwnym razie może zostać zwolniony wcześniej i nie będzie żadnego dźwięku. – Sten

Powiązane problemy