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).我可以让音频播放和录音同时工作的唯一方法是:
音频会话是AVAudioSessionCategoryPlayAndRecord和kAudioSessionProperty_OverrideCategoryMixWithOthers属性为true.
我在录制前开始播放.调用AVAudioRecorder prepareToRecord后,在获得音频路径更改之前不要开始录制.即使您之前开始录制也不会失败,但音频路径更改似乎会导致录制失败.
我尝试过其他组合,但这是唯一一次有效的组合.
| 归档时间: |
|
| 查看次数: |
4355 次 |
| 最近记录: |