文档章节

使用System Sound Services后台播放声音

RDeveloper
 RDeveloper
发布于 2016/07/29 15:42
字数 315
阅读 18
收藏 0

最近在做运动相关的应用,需要在应用退到后台的时候播放声音,比如你已经跑了多少公里了,GPS信号不好,目标已达成等。

刚开始使用了 AVAudioPlayer,实现了后台播放的功能,但发现一个比较致命的问题:当其他应用也播放声音的时候就会被打断!

后来研究了一下,使用System Sound Services可以解决这个问题,代码如下:

#pragma mark - System Sound Services
 
 //播放多个文件
- (void)playWithWithFiles:(NSArray *)files
{
    if (![files isValidArray] || files.count <= 0) {
        return;
    }
 
    [self stop];
 
    [self.audioFiles removeAllObjects];
    [self.audioFiles addObjectsFromArray:files];
    [self playAudio:files.firstObject];
}
 
 //播放单个文件
- (void)playAudio:(NSString *)filePath
{
    AudioServicesDisposeSystemSoundID(self.currentSoundID);
 
    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    if (fileURL != nil) {
        SystemSoundID theSoundID;
        OSStatus error = AudioServicesCreateSystemSoundID((__bridge CFURLRef)fileURL, &theSoundID);
        if (error == kAudioServicesNoError) {
            self.currentSoundID = theSoundID;
            AudioServicesAddSystemSoundCompletion(theSoundID, NULL, NULL, (void *)completionCallback, NULL);
            AudioServicesPlaySystemSound(theSoundID);
        }
        else {
            NSLog(@"Failed to create sound ");
        }
    }
}
 
 //停止播放当前声音
- (void)stop
{
    [self.audioFiles removeAllObjects];
    AudioServicesDisposeSystemSoundID(self.currentSoundID);
}
 
 //播放完成后回调
void completionCallback(SystemSoundID mySSID)
{
    AudioServicesDisposeSystemSoundID(mySSID);
 
    if ([VoiveManager sharedInstance].audioFiles.count > 0) {
        [[VoiveManager sharedInstance].audioFiles removeObjectAtIndex:0];
    }
 
    if ([VoiveManager sharedInstance].audioFiles.count > 0) {
        [[VoiveManager sharedInstance] playAudio:[VoiveManager sharedInstance].audioFiles.firstObject];
    }
}​​ 

当然,使用System Sound Services也有它的限制:

  1. 只能播放一些很小的提示或者警告的声音
  2. 声音长度不能大于30秒
  3. 不能控制进度
  4. 格式支持比较少

© 著作权归作者所有

共有 人打赏支持
RDeveloper
粉丝 4
博文 26
码字总数 8379
作品 0
广州
高级程序员
iPhone 应用开发:音频播放

在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。在我做过的几个应用中,每个都涉及到音效,所以在这里做个简单的归纳,很多都是引用自《iPhone Application Programming ...

长平狐
2012/08/13
84
0
ios音频播放

在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。在我做过的几个应用中,每个都涉及到音效,所以在这里做个简单的归纳,很多都是引用自《iPhone Application Programming ...

长平狐
2012/10/09
217
0
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(7)-----声音播放、硬件信息、键盘模拟及钩子、鼠标模拟及钩子等设备相关

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。 本篇继续继续整理优化已有的共用类库,并继续发表随笔介绍公...

长平狐
2012/08/22
76
0
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(7)-----声音播放、硬件信息、键盘模拟及钩子、鼠标模拟及钩子等设备相关

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。 本篇继续继续整理优化已有的共用类库,并继续发表随笔介绍公...

长平狐
2012/06/11
106
0
AVFoundation开发秘籍笔记-02播放和录制音频

一、音频会话 AVAudioSession 音频会话在应用程序和操作系统之间扮演着中间人的角色,提供一种简单实用的方法是OS得知应用程序应该如何与iOS音频环境进行交互。 有框架引入。每个iOS应用程序...

竹与豆
05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

kernel version does not match DSO version

错误信息: kernel version 384.11 does not match DSO version 384.130.0 原因是: cuda driver版本太低,不匹配DSO 简单有效的修复方法,升级nvidia driver, 步骤如下: 1. google seach ...

刘小米
今天
0
0
maven坐标和依赖

一、maven坐标详解 <groupId>com.fgt.club</groupId><artifactId>club-common-service-facade</artifactId><version>3.0.0</version><packaging>jar</packaging> maven的坐标元素说......

老韭菜
今天
1
0
springmvc-servlet.xml配置表功能解释

问:<?xml version="1.0" encoding="UTF-8" ?> 答: xml version="1.0"表示是此xml文件的版本是1.0 encoding="UTF-8"表示此文件的编码方式是UTF-8 问:<!DOCTYPE beans PUBLIC "-//SPRING//......

隐士族隐逸
今天
1
0
基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部