文档章节

使用System Sound Services后台播放声音

RDeveloper
 RDeveloper
发布于 2016/07/29 15:42
字数 315
阅读 24
收藏 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
95
0
ios音频播放

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

长平狐
2012/10/09
255
0
AVFoundation开发秘籍笔记-02播放和录制音频

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

竹与豆
05/25
0
0
iPhone 应用开发:音频播放

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

长平狐
2012/08/13
118
0
iOS 多媒体

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

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

没有更多内容

加载失败,请刷新页面

加载更多

学习LinkedBlockingDeque源码

之前已经看了实现deque接口的ArrayDeque, ConcurrentLinkedDeque, LinkedList,也不能落下ConcurrentLinkedDeque,但是好像没在项目中用过。 这里看到实现的接口还有BlockingDeque<E>, Block...

woshixin
29分钟前
1
0
实战:用Python实现随机森林

摘要: 随机森林如何实现?为什么要用随机森林?看这篇足够了! 因为有Scikit-Learn这样的库,现在用Python实现任何机器学习算法都非常容易。实际上,我们现在不需要任何潜在的知识来了解模型...

阿里云官方博客
32分钟前
1
0
进程管理利器Supervisor--centos7下安装与卸载

目录 概述 环境准备 检查python环境 在线安装 配置Supervisor 启动并验证 概述 Supervisor的安装可以有在线安装和离线安装两种方式。安装方式取决于服务器是否联网,联网的话可采用在线安装,...

java_龙
38分钟前
4
0
spring系列汇总

spring spring-基于可扩展Schema的特性自定义标签 springmvc-同一个访问资源,多种视图解析方式 spring cache 配置使用aspectj模式织入 基于注解的spring缓存,轻松无侵入解决cache问题 spri...

细肉云吞
39分钟前
4
0
vsftpd搭建ftp

12月10日任务 14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp exportfs命令 在nfs运行后的一段时间内,如果需要添加共享目录,这时需要修改exports文件,并...

robertt15
41分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部