在后台启动音频流

时间:2013-07-08 05:02:28

标签: objective-c background audio-streaming

我正在开发一个应用程序,它允许流式传输一个接一个播放的音频文件列表。我正在使用来自github的mattgallagher的audiostreamer。

当应用程序处于活动状态时,此功能正常,但当它在后台运行并且一首歌曲完成时,下一首歌曲无法启动。换句话说,音频流的初始化无法在后台运行

在我的info.plist中,我已将“所需的后台模式”设置为“ App播放音频”,但是当应用程序出现时,这无助于启动流在后台。

现在已经过了一周,我正在尝试寻找解决方案,但没有找到任何解决方案。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

当您停止播放音频文件时,您的应用程序将立即停止,因此第二个应用程序将无法开始播放。

初始化一个音频会话,它将在循环中播放短的静音音频文件。只要你需要,你可以保留它。 会话应该允许混合音频,这对音频没有影响,因为音频文件是静音的。

AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionSetActive(YES);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);

UInt32 allowMixing = true;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);

NSString* path = [[NSBundle mainBundle] pathForResource:@"silentAudio" ofType:@"m4a"];
NSURL* fileURL = [NSURL fileURLWithPath:path];
NSError* error = nil;
self.beatPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
if (error != nil)
{
    //process the error
}
_beatPlayer.numberOfLoops = -1;
[_beatPlayer play];

停止播放也会停止应用程序线程:

[_beatPlayer stop];

答案 1 :(得分:0)

您应该使用UIBackgroundModesiPhoneOSKeys

.plist文件中:

<key>UIBackgroundModes</key>
<array>
   <string>audio</string>
</array>

更新

将此添加到您的初始化代码:

NSError *setCategoryErr = nil;
NSError *activationErr  = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr];