gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:38:18 26 4
gpt4 key购买 nike

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

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

一旦我将两者放在一起,录音就会抛出对声音没有反应的值,并且视频不再播放。顺便说一下,这种情况只发生在我的设备(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 设置一个类别。如果我在应用程序启动后实现此代码,视频正在播放,但录音机仍然输出相同的值而不对声音使用react。

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 吗?

感谢您的每一个提示!

干杯,拉斐尔;)

最佳答案

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

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
self);

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

  1. Audio Session 为 AVAudioSessionCategoryPlayAndRecord,kAudioSessionProperty_OverrideCategoryMixWithOthers 属性为 true。

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

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

关于iphone - 同时使用 AVPlayer 播放视频并使用 AVAudioRecorder 录制声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com