【问题标题】:Sprite Kit sound issue, how to prevent stop user soundSprite Kit 声音问题,如何防止停止用户声音
【发布时间】:2014-05-20 13:22:10
【问题描述】:

我在使用 Sprite Kit 时遇到问题,当我想在用户交互后播放声音时。

用户正在使用应用(例如 Spotify)收听音乐。
用户想在他听歌的时候玩我的游戏,目前当使用启动我的应用程序时,他的歌被停止了。

事实上,我想阻止这种行为:如果其他应用程序正在使用“声音”,我该怎么做才能不播放声音,或者如何播放我的声音并保持用户的音乐播放。

目前这是我的代码:

@property (strong, nonatomic) SKAction *hitSound;

在init方法中:

 _hitSound = [SKAction playSoundFileNamed:@"laugh.caf" waitForCompletion:NO];

用户按下屏幕后:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
 SKAction *sequence = [SKAction sequence:@[_hitSound]];
    [node runAction:sequence completion:^{
       //Stuff
}];

}

【问题讨论】:

    标签: ios ios7 avplayer


    【解决方案1】:

    您的应用程序需要管理允许背景音频继续播放的 AVAudioSession。这将允许后台音频应用程序继续播放,并且您的应用程序声音将与之混合。

    AVAudioSession 类是一个单例类,是 AVFoundation 框架的一部分。请务必将 AVFoundation 链接到您的目标。在需要它的类中导入框架。

    #import <AVFoundation/AVFoundation.h>
    

    在应用程序委托中声明应用程序音频会话的好地方,因此可以将以下代码放在 application:didFinishLaunchingWithOptions: 方法中。

    // activate a mixable session
    // set audio session category AVAudioSessionCategoryPlayback
    
         [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];
         [[AVAudioSession sharedInstance] setMode:AVAudioSessionModeDefault error:nil];
         [[AVAudioSession sharedInstance] setActive:YES error: nil];
    

    就您自己的应用程序是否正在播放而言,一种可能性是拥有一个名为 'mute'BOOL 类型的属性> 并检查是否需要 SKAction 来播放音频。您可以检查是否正在播放背景音频并相应地设置 'mute' 属性。您还可以决定为设置此属性的用户提供一个界面。可能性很多。

    您可以检查背景音频是否像这样播放-

    BOOL isPlayingAudio = [[AVAudioSession sharedInstance] otherAudioPlaying];
    

    您的代码可以从这里决定将 self.mute 设置为什么。

    AVAudioSession 类参考在这里找到 - AVAudioSession Class Reference

    【讨论】:

    • 考虑使用AVAudioSession 类别AVAudioSessionCategoryAmbient(并且不需要该选项)而不是AVAudioSessionCategoryPlayback。即使设备被锁定或设置为静音,后者也可以播放声音;这似乎不适合游戏。
    • 考虑将代码放在application:willFinishLaunchingWithOptions: 而不是application:didFinishLaunchingWithOptions:。如果你的游戏和我的一样,它使用应用程序状态恢复,并在恢复期间预加载场景资源--including sounds。此时AVAudioSession 应该已经配置好了。
    • 查看头文件,显然,从 iOS 8 开始,您应该使用 [AVAudioSession sharedInstance].secondaryAudioShouldBeSilencedHint; 而不是 otherAudioPlaying。当另一个具有不可混合音频会话的应用程序正在播放音频时,这将是真的。应用程序可以使用此属性作为提示,以使次要于应用程序功能的音频静音。例如,使用 AVAudioSessionCategoryAmbient 的游戏应用程序可以使用此属性来决定静音其音轨,同时保持其音效不静音。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多