【问题标题】:How to stop and resume background audio from iPhone app?如何从 iPhone 应用程序停止和恢复背景音频?
【发布时间】:2012-09-10 14:24:41
【问题描述】:

我正在使用基于消息传递的 iPhone 应用程序。我添加了哔声以接收来自其他人的消息。我正在使用AVAudioPlayer 播放哔声。我的问题是当用户在后台听到来自其他应用程序的歌曲时,如果他们从我的应用程序收到消息,则会播放哔声并且背景歌曲/音频停止不恢复。

我想通过暂停背景歌曲/音频来播放我的哔声,我必须再次从我的应用程序中恢复该音频/歌曲。在iOS开发中可能吗?谁能帮帮我?

已编辑:

这是我的示例代码。

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Music";
    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

    NSString *urlString = [[NSBundle mainBundle] pathForResource:@"basicsound" ofType:@"wav"];
    NSURL *audioURL = [[NSURL alloc] initWithString:urlString];
    NSError *error;
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:&error];
    [audioPlayer setDelegate:self];
    [audioPlayer prepareToPlay];

    audioSession = [AVAudioSession sharedInstance];
    [audioSession setActive:YES error:&error];
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
    [audioPlayer play];    
}

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    if (flag == YES) 
    {
        NSLog(@"Audio Played successfully");
        NSError *error;
        [audioSession setActive:NO error:&error];
    }
}

【问题讨论】:

    标签: ios objective-c audio avaudioplayer resume


    【解决方案1】:

    您不能对所有应用程序都这样做。对于在其应用程序中使用 iPod 播放器的应用程序:

    假设您的应用程序在前台。你可以这样做:

    MPMusicPlayerController *mp = [MPMusicPlayerController iPodMusicPlayer];        
    [mp stop]; // or [mp pause]
    

    这需要MediaPlayer.framework#import <MediaPlayer/MediaPlayer.h>

    MPMusicPlayerController Reference 上阅读更多信息。


    要通过音频播放器会话执行此操作,您可以使用属性kAudioSessionCategory_SoloAmbientSoundReference here.

    这类似于AVAudioSession class 中定义的AVAudioSessionCategorySoloAmbient

    引用文档:

    当您使用此类别时,来自其他应用的音频会被静音。

    【讨论】:

    • 感谢您的回答。它工作完美,符合我的预期。它仅适用于来自 iPod 音乐播放器的音频。可以从我们的应用程序控制其他应用程序的音频吗?寻找你的答案。谢谢。
    • 只有在他们使用过 iPodMusicPlayer 播放的情况下。有多种方法可以使用 AVPlayer 播放背景音乐,并且您的音频会话可以使其他应用程序静音。我将更新我的答案以反映这一点。
    • 非常感谢。真的,我从过去的一周开始挣扎。期待你的更新。非常感谢。
    • 我的应用程序播放完毕后如何恢复其他应用程序的音频?有可能的?谢谢。
    • 啊,那是你必须尝试的。可能会将您的音频会话重置回AVAudioSessionCategoryAmbient 和/或使用kAudioSessionProperty_OverrideCategoryMixWithOthers。如果这对您有用,请在此处回信!
    【解决方案2】:

    聚会有点晚了,但对于那些在播放声音后寻找暂停和取消暂停背景(即 ipod 音乐)问题的解决方案的人,您应该在停用音频会话时使用以下内容。

    [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];
    

    //未弃用的新方法:

    [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];
    

    当您在应用程序中不需要音频会话时(即当您不输出任何声音时),您应该停用它。在有意义的情况下,您应该使用此方法,以便通知任何背景音频并可以恢复(收到此通知的应用程序不一定必须恢复)。

    此外,您必须使用适当的音频类别才能让您的声音在需要时专门播放。这可以通过AVAudioSessionCategoryAmbient 以外的任何类别来完成。当您的音频会话激活时,这将自动为您暂停背景音频。但是,它不会重新激活任何背景音频,这是通过使用上述代码完成的。在这种情况下,如前所述,背景音频会决定如何处理通知。

    旁注,另一个要研究的选项是音频“闪避”。如果您的声音不是必须单独播放,例如简单的警报声,请尝试使用闪避,这将降低背景音频的音量来播放您的声音,完成后将在您的声音结束时将背景音频恢复正常玩。有关这些概念的更多详细信息,请参阅Configure your Audio Session

    【讨论】:

    • 这个setActive:NO... 声明放在什么地方最合适?当我尝试在 applicationDidEnterBackground: 方法中调用它时出现错误。我在application:didFinishLaunchingWithOptions:上将其设置为YES。
    • 感谢丽贝卡的回答。这正是我一直在寻找的。我没有意识到我们需要设置 AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation。
    • 该方法在 iOS 6 中已被弃用
    • 自iOS6以来已弃用,是否有新方法可以使用?
    猜你喜欢
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    相关资源
    最近更新 更多