AVAudioPlayer 播放问题,两种声音作为回声
Posted
技术标签:
【中文标题】AVAudioPlayer 播放问题,两种声音作为回声【英文标题】:AVAudioPlayer play issue with two sounds as echo 【发布时间】:2021-06-06 09:43:58 【问题描述】:我有一个单独的视图控制器,其中包含一些音频消息(带有 mp3 文件的 URL)。这是我用来开始播放消息的代码:
- (void)playAudioMsg
[[AVAudiosession sharedInstance] setCategory: AVAudioSessionCategorySoloAmbient error: nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://blahblahblah.mp3"]];
NSData *data = [NSData dataWithContentsOfURL:URL];
audioPlayer = [[AVAudioPlayer alloc] initWithData:data error:nil];
audioPlayer.numberOfLoops = 0;
audioPlayer.delegate=self;
[audioPlayer play];
我第一次打开这个视图控制器并单击要播放的消息时,它播放得很好。
然后我关闭一个视图控制器。
然后我再次打开它并单击相同的音频消息。会发生什么就像创建了两个单独的 AVAudioPlayer - 其中一个立即开始播放音频,另一个延迟一秒(听起来第一条消息带有回声。
最有趣的是,当我关闭视图控制器时,一条消息停止播放,另一条消息继续在后台播放,即使在关闭视图控制器时,我调用 [audioPlayer stop]
。
谁能帮帮我,好吗?
【问题讨论】:
【参考方案1】:我找到了解决方案。
问题在于,当我打电话给-(void) playAudioMsg ...
时,我是这样使用的:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playAudioMsg) name:@"playAudioMsg" object:nil];
... 在- (void) viewDidLoad ...
中声明。但是后来我在离开 ViewController 时完全忘记了移除那个观察者:
-(void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"playAudioMsg" object:nil];
在不移除观察者然后返回同一页面的情况下,它会为同一观察者设置重复项,因此方法 playAudioMsg
会被调用两次。
【讨论】:
以上是关于AVAudioPlayer 播放问题,两种声音作为回声的主要内容,如果未能解决你的问题,请参考以下文章
AVAudioPlayer 重置当前播放的声音并从头开始播放