我能够录制视频并将电影正确输出到文件。但是,尝试使用AVAudioPlayer播放某些音频时,视频记录出现问题(无视频输出)。这是否意味着我不能同时使用AVCaptureSession和AVAudioPlayer?这是我的代码,用于创建捕获 session 并播放音频。首先开始视频捕获,然后在捕获过程中,我想播放一些音频。非常感谢您的帮助。

创建捕获 session 以记录视频(带有音频)的代码-输出到.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];
}

播放音频的代码,在视频捕获 session 期间调用此功能。如果我不调用此功能,则将录制视频,并且能够将其保存到.mov文件。但是,如果我调用此函数,则不会输出.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];
}

最佳答案

我通过设置 Audio Session 来解决此问题。在创建音频播放器对象播放音频之前,我调用了以下函数。这样,我就可以录制视频(带有音频)并同时播放音频。

- (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];
    }

关于iphone - 一起使用AVCaptureSession和AVAudioPlayer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10903542/

10-12 02:05