使用AVPlayer播放视频并同时使用AVAudioRecorder录制声音

Rap*_*ael 7 iphone simultaneous recording avaudioplayer avplayer

我谷歌搜索这个问题很多天但我找不到解决我的简单问题的方法.

我正在尝试录制声音时播放视频.没有视频,录制声音效果很好.视频无需录制即可正常工作.

一旦我将两者放在一起,录音就会抛出对声音没有反应的值,而视频不再播放.顺便说一下,这只发生在我的设备上(iPhone 4/iOS5).在模拟器中一切正常.

这是我的代码的缩减版本,它位于ViewController中.

// Audio Recorder

NSURL *nullUrl = [NSURL fileURLWithPath:@"/dev/null"];

NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithFloat:44100.0],                 AVSampleRateKey,
                          [NSNumber numberWithInt:kAudioFormatAppleLossless], AVFormatIDKey,
                          [NSNumber numberWithInt:1],                         AVNumberOfChannelsKey,
                          [NSNumber numberWithInt:AVAudioQualityMax],         AVEncoderAudioQualityKey,
                          nil];

NSError *recorderError;
_recorder = [[AVAudioRecorder alloc] initWithURL:nullUrl settings:settings error:&recorderError];

if (_recorder)
{
    [_recorder prepareToRecord];
    _recorder.meteringEnabled = YES;
    [_recorder record];

    _levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(levelTimerCallback:) userInfo:nil repeats:YES];
}


// Video Player

NSURL *url = [[NSBundle mainBundle] URLForResource:@"Video"
                                      withExtension:@"mp4"
                                       subdirectory:nil];

_avPlayer = [[AVPlayer playerWithURL:url] retain];
_avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:_avPlayer] retain];

_avPlayerLayer.frame = self.view.layer.bounds;
[self.view.layer addSublayer:_avPlayerLayer];

[_avPlayer play];
Run Code Online (Sandbox Code Playgroud)

记录器只输出一个在levelTimerCallback方法中读取的值.该视频只播放一段短片.

我发现我必须为AVAudioSession设置一个类别.如果我在应用程序启动后实现此代码,则视频正在播放但录制器仍会输出相同的值而不会对声音做出反应.

NSError *error = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[audioSession setActive:YES error:&error];
Run Code Online (Sandbox Code Playgroud)

我可以想象我可能要对AudioSessionSetProperty做些什么

UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);    

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
Run Code Online (Sandbox Code Playgroud)

但这并没有改变任何事情.您是否了解我缺少的内容或如何正确设置AudioSession?

谢谢你的每一个暗示!

干杯,拉斐尔;)

use*_*810 13

我有同样的问题(除了我使用AVPlayer播放音频而不是视频).我建议您开始收听音频路由更改,并且当AVPlayer和AVAudioRecorder同时启动时,您将看到多次路由更改.

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
                                audioRouteChangeListenerCallback,
                                self);
Run Code Online (Sandbox Code Playgroud)

在回调中打印出类别和路由(kAudioSessionProperty_AudioRoute).我可以让音频播放和录音同时工作的唯一方法是:

  1. 音频会话是AVAudioSessionCategoryPlayAndRecord和kAudioSessionProperty_OverrideCategoryMixWithOthers属性为true.

  2. 我在录制前开始播放.调用AVAudioRecorder prepareToRecord后,在获得音频路径更改之前不要开始录制.即使您之前开始录制也不会失败,但音频路径更改似乎会导致录制失败.

我尝试过其他组合,但这是唯一一次有效的组合.