0

我正在尝试使用 AVPlayer 流式传输远程 mp3。

我已经设置了音频会话,并将在后台播放音频添加到我的 info.plist 文件中。

我正在运行此代码:

self.timeObserver = [self->player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:nil usingBlock:^(CMTime time) {
    [self updateControls];
}];

添加一个时间观察器,每秒调用一次 updateControls。

问题是,当声音缓冲区低时,播放器只是暂停,而后台的这段代码也停止了,所以我不得不再次在应用程序中手动按下播放。(如果我暂停播放器,这段代码也不会运行)

我做错什么了吗?如何在后台不间断地运行一段代码?

4

2 回答 2

0

您需要像这样封装您的背景代码:

__block UIBackgroundTaskIdentifier bgTask = nil;
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
        [[UIApplication sharedApplication] endBackgroundTask: bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

//Your bg code here

[[UIApplication sharedApplication] endBackgroundTask: bgTask];
    bgTask = UIBackgroundTaskInvalid;
于 2011-08-16T05:12:30.210 回答
0

您不能无限期地在后台运行任意代码。您可以继续播放音频,但如果您不是最前面的应用程序,则不应期望更新您的 UI。当您的应用移回前台时,您可以更新 UI。

只要您正确设置了 AVAudioSession 并使其处于活动状态,并且设置了 UIBackgroundModes,那么您应该可以很好地进行音频处理。

请参阅http://developer.apple.com/library/iOS/#documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Configuration/Configuration.html

于 2011-08-21T22:44:47.490 回答