AVAudioPlayer 行为处理问题

Posted

技术标签:

【中文标题】AVAudioPlayer 行为处理问题【英文标题】:AVAudioPlayer behaviour handling issue 【发布时间】:2013-02-22 06:18:44 【问题描述】:

我一直在努力学习 AVAudioPlayer 及其行为。

所以我先写了

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
player.numberOfLoops = -1;
[player play];

只要应用程序没有进入后台,它确实运行良好。于是我再次搜索,发现我需要在plist中添加条目并且还写了以下代码

NSError *activationError = nil;
    if([[AVAudiosession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&activationError] == NO)
        NSLog(@"*** %@ ***", activationError);

    [[AVAudioSession sharedInstance] setActive: YES error: nil];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

现在我的示例应用程序也在后台播放声音。然后我遇到了另一个问题。如果我在所有这些处理之前放置睡眠,则在睡眠期间将我的应用程序置于后台并开始从其他应用程序播放音乐,在这种情况下,我的应用程序无法播放声音。这可能是因为它没有获得其他音乐应用程序所占用的音频会话。

问题 1. 我知道有一种方法可以检测是否有任何其他声音正在播放,但我找不到如何停止它。有一些方法可以停止像 iPod 这样的标准应用程序声音,但是否有任何通用方法可以停止任何其他应用程序的声音。 2. [player play]; 给出NO 作为失败的结果。我如何找到失败的原因。我已经实现了audioPlayerDecodeErrorDidOccur:error: 方法,但它从未被调用过。

请分享您对此的了解。我已经解决了大多数关于相同问题的堆栈溢出问题,但没有发现任何对这个特定问题有用的东西。

【问题讨论】:

请打印您的 soundFileURL @Manohar :使用以下代码获取 URL NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"mp3"]; NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; 它确实有效,直到应用程序处于后台并且没有其他内容正在播放。所以我认为 URL 在这里没有任何问题。 NSURL *soundFileURL = [NSURL URLWithString: soundFilePath];试试这个 @Manohar :不......同样的问题没有变化 【参考方案1】:
-(void)loadPlayer

        NSURL *audioFileLocationURL = [NSURL URLWithString:[[NSBundle mainBundle] URLForResource:@"01-YedhiYedhi[www.AtoZmp3.in]" withExtension:@"mp3"]];
        NSError *error;
        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFileLocationURL error:&error];
        [audioPlayer setNumberOfLoops:-1];
        if (error)
        
            NSLog(@"%@", [error localizedDescription]);

            [[self volumeControl] setEnabled:NO];
            [[self playPauseButton] setEnabled:NO];

            [[self alertLabel] setText:@"Unable to load file"];
            [[self alertLabel] setHidden:NO];
        
        else
        
            [[self alertLabel] setText:[NSString stringWithFormat:@"%@ has loaded", str]];
            [[self alertLabel] setHidden:NO];

            //Make sure the system follows our playback status
            [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
            [[AVAudioSession sharedInstance] setActive: YES error: nil];

            //Load the audio into memory
            [audioPlayer prepareToPlay];
        
    
    if (!self.audioPlayer.playing) 
        [self playAudio];

     else if (self.audioPlayer.playing) 
        [self pauseAudio];

    


- (void)playAudio 
    [audioPlayer play];

【讨论】:

什么是 alertLabel 以及为什么需要使用它?我不希望在此进行任何用户交互。 audioPlayer self. audioPlayer 也不同吗? Manohar 您的代码似乎不完整。我不知道回答 2 我的第二个问题。也没有给出[self playAudio] 的实现。只是[player play].

以上是关于AVAudioPlayer 行为处理问题的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioPlayer 多重声音嘈杂

静音按钮不会静音 AVAudioPlayer

AVAudioPlayer 不播放音频文件 - swift

如何通过 iPhone 应用录制音频?

AVAudioPlayer pause() 未按预期运行

多任务处理后 AVAudioPlayer 继续播放