7

我在谷歌上搜索这个问题很多天,但我没有找到解决我的简单问题的方法。

我正在尝试在录制声音时播放视频。在没有视频的情况下录制声音也能正常工作。并且视频在没有录制的情况下也能正常工作。

一旦我将两者放在一起,录音就会抛出对声音没有反应的值,并且视频不再播放。顺便说一句,这只发生在我的设备(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];

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

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

NSError *error = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[audioSession setActive:YES error:&error];

我可以想象我可能不得不对 AudioSessionSetProperty 做一些事情

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

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

但这不会改变任何事情。您知道我缺少什么或如何正确设置 AudioSession 吗?

谢谢你的每一个提示!

干杯,拉斐尔;)

4

1 回答 1

14

我有同样的问题(除了我使用 AVPlayer 播放音频而不是视频)。我建议你开始监听音频路由变化,当 AVPlayer 和 AVAudioRecorder 同时启动时,你会看到路由多次变化。

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
                                audioRouteChangeListenerCallback,
                                self);

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

  1. 音频会话是 AVAudioSessionCategoryPlayAndRecord 并且 kAudioSessionProperty_OverrideCategoryMixWithOthers 属性为 true。

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

我尝试了其他组合,但这是唯一每次都有效的组合。

于 2011-12-09T01:10:00.193 回答