【问题标题】:Resume background audio after AVAudioPlayer is pausedAVAudioPlayer 暂停后恢复背景音频
【发布时间】:2012-08-26 08:03:11
【问题描述】:

我开发了一个 iPhone 应用程序,它允许其他应用程序在后台播放音频。为了实现这一点,我像这样初始化我的音频会话:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

在我的应用程序的某个时刻,我提供了一个音频播放器来播放存储在 CoreData 中的一些文件,这些文件使用 AVAudioPlayer。当用户点击播放按钮时,应该暂停背景音频。当播放器结束或暂停时,背景音频应恢复播放。

在播放器完成播放后恢复时

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil];
}

就像一个魅力,我在暂停后被卡住了。它应该在按钮的 IBAction 中以相同的方式工作

-(IBAction)pausePlayer
{
    if (self.player.isPlaying) {
        [self.player pause];
        [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil];
    }
}

但我总是遇到同样的错误:

Unable to deactivate audio session. Error: Error Domain=NSOSStatusErrorDomain Code=560030580 "The operation couldn’t be completed. (OSStatus error 560030580.)"

有什么建议为什么在这种情况下无法停用 AudioSession?

【问题讨论】:

  • 您是否尝试将音频帧偏移设置为 -1 和/或完全停止您的播放器实例?
  • 560030580 转换为十六进制并解释为 ASCII 是 !act。如果您在AudioSession.h 中查找此内容,则该错误为kAudioSessionNotActiveError
  • @SteveMadsen 你是个了不起的十六进制低语者。

标签: ios ios5 avaudioplayer avaudiosession


【解决方案1】:

我尝试了 3 个小时终于明白了,这是我所做的

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()

    @property(strong, nonatomic)AVAudioPlayer *player;
    @property(strong)AVAudioSession *session;
@end

@implementation ViewController


- (IBAction)playsound:(id)sender

{

   NSURL *url=[[NSURL alloc]initWithString:[[NSBundle mainBundle]       pathForResource:@"sound" ofType:@"mp3"]];
    NSError *err;

    self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&err];
    [self.player setDelegate:self];
    [self.player setVolume:2.5];

    self.session=[AVAudioSession sharedInstance];

    [self.player prepareToPlay];
    [self.player play];

}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag

{

    NSError *err;
    [self.session setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&err];



}


@end

【讨论】:

  • 您实施的情况对我来说已经有效。尝试暂停播放器并停用会话以恢复后台播放。这对我不起作用。
【解决方案2】:

看来停用太早了。根据 AVAudioSession 类参考“如果任何关联的音频对象(例如队列、转换器、播放器或录音机)当前正在运行,则停用会话将失败。”

似乎有几个解决方案:

  1. 循环去激活直到成功。

    这是http://iknowsomething.com/ios-sdk-spritekit-sound/提倡的

  2. 推迟停用,例如直到确实有必要为止。

  3. 当使用例如Audio Queue 服务,您可以考虑立即停止。 (未测试)

    在可以收听录音的录音应用中,我只在更改类别之前使用以下顺序停用:激活 NO、setCategory 和激活 YES。

    参见例如“当您的应用程序运行时,Apple 建议您在更改任何设置值之前停用您的音频会话”在 Apple 的音频会话编程指南中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多