文档章节

使用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
AVFoundation开发秘籍笔记-02播放和录制音频

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

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

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

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

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

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

没有更多内容

加载失败,请刷新页面

加载更多

Java并发编程:volatile关键字解析

volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生...

engeue
20分钟前
1
0
php-fpm配置文件详解

第一部分:FPM 配置 参数          | 说明 -p            | 命令行中动态修改--prefix   ;include=etc/fpm.d/*.conf  | 用于包含一个或多个文件,如果glob(3)存在(...

bengozhong
21分钟前
1
0
Django允许外部ip访问

1、关闭防火墙 service iptables stop 2、设置django 开启django时,使用0.0.0.0:xxxx,作为ip和端口例如: python manage.py runserver 0.0.0.0:9000 3、在settings里修改ALLOWED_HOSTS = [......

MichaelShu
25分钟前
1
0
机器学习在客户管理场景中的应用

使用机器学习进行客户管理,我们可以得到客户360度全方位的视图。 本文以SAP Cloud for Customer的客户管理应用为例,介绍机器学习是如何同传统的客户管理应用进行集成的。 打开SAP C4C的客户...

JerryWang_SAP
31分钟前
1
0
ftp链接ubuntu虚拟机

1.在主机上安装Xftp 5 2.在虚拟机中输入: sudo apt-get install vsftpd 3.打开 /etc/vsftpd.conf修改如下变量 listen=YES anonymous_enable=YES local_enable=YES write_enable=yes local_......

15834278076
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部