AVAudioPlayer无法在后台播放

时间:2013-05-15 11:52:04

标签: ios avaudioplayer audiosession

我正在使用AVAudioPlayerNSFileHandle来制作音频流。基本思想是我将流式音频数据保存到带有文件系统的设备,然后使用AVAudioPlayer播放刚刚保存的文件。即使流媒体正在进行中,AVAudioPlayer仍然可以播放该文件。

我有UIButton开始播放/下载。当下载的数据累积到特定数量的字节时,AVAudioPlayer将自动播放(AVAudioPlayer的“播放”方法)。我的问题是:我点击按钮开始流式传输/下载,然后很快按下iPhone的主页按钮,让我的应用程序转到后台。下载继续在后台工作,但AVAudioPlayer的“播放”方法返回“NO”,这意味着“播放”方法不播放音频。

我将AVAudioSession相关代码添加到我的音频播放器的init方法中:

- (id) initWithURL:(NSString *) downloadedMusicURL
{
    if ((self = [super init]))
    {       
        [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

        CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef)downloadedMusicURL, kCFURLPOSIXPathStyle, FALSE);

        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:CFBridgingRelease(url) error:nil];

        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setActive:YES error:nil];
        [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    }

    return self;
}

同样在info.plist中,我为Key“Required background modes”添加了一个“App播放音频”项。但是,“播放”仍然无法在后台正确调用。还有什么我想念的?非常感谢。

4 个答案:

答案 0 :(得分:2)

您的应用无法在后台播放音频。这是有道理的。如果用户没有主动使用的应用程序突然开始产生声音,请想想设备会是什么样子!请记住,对用户而言,将应用程序发送到后台是相当于退出该应用程序的天真。你的应用程序不能像僵尸一样从死里复活并开始制造噪音!

背景音频设置允许您的应用程序在然后进入的时候,在前台 继续时生成音频的背景。然后它可以继续负责音频(如果它接收远程事件),直到其他应用程序产生声音;之后,您的应用程序将再次运行,直到它被带到前台并产生声音。

因此,如果您希望此功能正常运行,那么您需要在应用程序进入后台之前开始播放声音

答案 1 :(得分:1)

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];

/ * 和 在info.Plist文件中 所需的背景模式:App PLAYS Audio * /

答案 2 :(得分:0)

请在- (void)applicationDidEnterBackground:(UIApplication *)application

中使用此代码
UIApplication *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask = 0;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
[app endBackgroundTask:bgTask]; 
}];
AudioSessionSetActive(false);

并在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

中使用此代码
AudioSessionInitialize (NULL,NULL,NULL,NULL);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,sizeof (sessionCategory),&sessionCategory);
AudioSessionSetActive(true);

希望这会有所帮助。

答案 3 :(得分:0)

面对这个问题。我建议你使用AVAudioSessionCategoryOptionMixWithOthers和-setCategory:withOptions:error:。此外,在设置类别之后激活会话可能是有意义的,而不是之前。