文档章节

使用System Sound Services后台播放声音

RDeveloper
 RDeveloper
发布于 2016/07/29 15:42
字数 315
阅读 18
收藏 0
点赞 0
评论 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 ⋅ 0

ios音频播放

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

长平狐 ⋅ 2012/10/09 ⋅ 0

AVFoundation开发秘籍笔记-02播放和录制音频

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

竹与豆 ⋅ 05/25 ⋅ 0

iOS后台播放背景音乐文件

iOS从4.0之后支持后台播放声音了。下面是实现声音文件播放,并且用户关闭屏幕之后仍然能够播放声音文件。具体的实现方法如下: 在plist文件中加入下面的字段: 声明内容如下: Info.plist中添...

周国伟 ⋅ 2012/09/10 ⋅ 1

iOS 多媒体

一、音频 在iOS开发中,主要使⽤用四种⽅式来播放音频: System Sound Services (系统声音服务) AVAudioPlayer (高级音频播放器) : 只能播放一个完整的音频, 完全下载好的 AVPlayer(负责视频操...

从訫开始_倾深爱 ⋅ 2016/09/14 ⋅ 0

iPhone 应用开发:音频播放

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

长平狐 ⋅ 2012/08/13 ⋅ 0

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

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

长平狐 ⋅ 2012/08/22 ⋅ 0

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

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

长平狐 ⋅ 2012/06/11 ⋅ 0

iOS后台播放背景音乐文件

iOS从4.0之后支持后台播放声音了。下面是实现声音文件播放,并且用户关闭屏幕之后仍然能够播放声音文件。具体的实现方法如下: 在plist文件中加入下面的字段: 声明内容如下: Info.plist中添...

鉴客 ⋅ 2012/01/09 ⋅ 1

iOS后台播放背景音乐文件

转载地址:http://wangjun.easymorse.com/?p=1359 先mark一下,等着以后用,嘎嘎!! iOS从4.0之后支持后台播放声音了。下面是实现声音文件播放,并且用户关闭屏幕之后仍然能够播放声音文件。...

长平狐 ⋅ 2013/12/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 11分钟前 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部