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 在后台播放声音序列

AVAudioPlayer 重置当前播放的声音并从头开始播放

AVAudioPlayer- 从声音缓冲区播放

Swift - AVAudioPlayer,声音播放不正确

AVAudiorecorder 和 AVAudioPlayer 并不总是播放声音

使用 AVAudioPlayer 一次播放多个声音