Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在iOS中,我如何处理多任务情况下的其他音频播放?_Iphone_Ios_Ios4_Audioqueue_Audiosession - Fatal编程技术网

Iphone 在iOS中,我如何处理多任务情况下的其他音频播放?

Iphone 在iOS中,我如何处理多任务情况下的其他音频播放?,iphone,ios,ios4,audioqueue,audiosession,Iphone,Ios,Ios4,Audioqueue,Audiosession,文件中有一节是关于“”的 我使用的是MonoTouch(但请随意给出Objective-C答案,API是相同的),因此该文档中的代码如下所示: bool otherAudioPlaying = AudioSession.OtherAudioIsPlaying; if(otherAudioPlaying) AudioSession.Category = AudioSessionCategory.AmbientSound; else AudioSession.Category = A

文件中有一节是关于“”的

我使用的是MonoTouch(但请随意给出Objective-C答案,API是相同的),因此该文档中的代码如下所示:

bool otherAudioPlaying = AudioSession.OtherAudioIsPlaying;
if(otherAudioPlaying)
    AudioSession.Category = AudioSessionCategory.AmbientSound;
else
    AudioSession.Category = AudioSessionCategory.SoloAmbientSound;
结果是,如果我的应用程序启动时播放iPod音乐,iPod音乐将继续播放,并阻止我使用硬件音频解码器(反正我不需要)。如果我的应用程序启动时没有播放iPod音乐,我可以使用硬件解码器

然后,我可以使用
otherAudioPlaying
的值来确定是否开始播放我自己的音乐

现在,这在不支持多任务处理的旧操作系统上运行良好。但通过多任务处理,用户可以离开我的应用程序(将其背景化),开始在iPod上播放音乐,然后重新进入我的应用程序。然后他们的iPod音乐将被静音,我的音乐将再次开始播放

我想要的是,当我的应用程序返回前台时,iPod音乐继续播放——即使我的应用程序处于后台时,我自己的音乐正在播放(并使用硬件解码器)

(反过来,如果我的应用程序是在没有播放音乐的情况下运行的,我想检测一下,当它返回时,我是否可以开始播放音乐)

我该怎么做?(最好不要突然切断我的音频,保持正常的淡出效果。)


编辑:我还应该指出,我所有的音频工作都是在主线程之外完成的。

为什么不在应用程序代理多任务消息中实现它呢?在后台,暂停音频(必要时存储当前播放位置),并在应用程序恢复聚焦时将其旋转


再澄清一点:通过重置音频播放器状态来响应代理中的ApplicationIdentinterBackground:和通过将其设置为现在的方式来响应applicationWillEnterForeground:。您还可以让设置音频播放的对象通过NSNotificationCenter响应UIApplicationWillEnterBackgroundNotification/UIApplicationWillEnterForeggroundNotification,这可能会更容易一些,但代价是将你的应用程序在后台做的事情从你的应用程序委托类中抽象出来。

为什么不在你的应用程序委托多任务消息中实现它呢?在后台,暂停音频(必要时存储当前播放位置),并在应用程序恢复聚焦时将其旋转


再澄清一点:通过重置音频播放器状态来响应代理中的ApplicationIdentinterBackground:和通过将其设置为现在的方式来响应applicationWillEnterForeground:。您还可以让设置音频播放的对象通过NSNotificationCenter响应UIApplicationWillEnterBackgroundNotification/UIApplicationWillEnterForeggroundNotification,这可能会更容易一些,但代价是从应用程序委派类中抽象出应用程序在后台所做的事情。

关于您最后对refulgentis答案的评论,您可以暂停应用程序WillResignative中的音乐,并将状态保存操作和清理留给ApplicationIdentinterBackground。这可能有助于避免在后台转换状态期间出现任何奇怪的行为。

关于您对refulgentis答案的最后评论,您可以在ApplicationWillResignative中暂停音乐,并将状态保存操作和清理留给ApplicationIdentinterBackground。这可能会更好地避免在后台转换状态期间出现任何异常行为。

我知道
applicationidenterdbackground
,我认为解决方案将涉及响应它。我想弄清楚的是“暂停你的音频”和“重置你的音频播放器状态”的含义。嗯……我想我不明白。如果这是一个关于AudioSession的问题,你知道如何启动它,我假设类似的方法停止它?如果你真的不知道,我会查一下文件,然后再回答。在更平庸的层面上:我不能告诉你如何重置音频播放器状态,因为我不知道你是如何设置的。如果你停止它,IOS会考虑重置。我的音频播放器只是一个简单的硬件音频队列,本质上是在“音频队列服务编程指南”中描述的(除了它是在一个不同的线程上处理的,我收到通知的主线程)。问题是在ApplicationIdentinterBackground期间与AudioQueue/AudioSession API交互会导致异常行为或崩溃。不幸的是,文档(据我所知)没有描述API的这两个部分的交互方式。我知道
ApplicationIdentinterBackground
,我认为解决方案将涉及响应它。我想弄清楚的是“暂停你的音频”和“重置你的音频播放器状态”的含义。嗯……我想我不明白。如果这是一个关于AudioSession的问题,你知道如何启动它,我假设类似的方法停止它?如果你真的不知道,我会查一下文件,然后再回答。在更平庸的层面上:我不能告诉你如何重置音频播放器状态,因为我不知道你是如何设置的。如果你停止它,IOS会考虑重置。我的音频播放器只是一个简单的硬件音频队列,本质上是在“音频队列服务编程指南”中描述的(除了它是在一个不同的线程上处理的,我收到通知的主线程)。问题是在ApplicationIdentinterBackground期间与AudioQueue/AudioSession API交互会导致异常行为或崩溃。不幸的是,文档(据我所知)没有描述API的这两部分的交互方式。设置AudioSession.category=AVAudioSessionCategoryAmbient有什么错,不管是否播放其他音频?@Will