我正在使用AVAudioPlayer
和NSFileHandle
来制作音频流。基本思想是我将流式音频数据保存到带有文件系统的设备,然后使用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播放音频”项。但是,“播放”仍然无法在后台正确调用。还有什么我想念的?非常感谢。
答案 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:。此外,在设置类别之后激活会话可能是有意义的,而不是之前。