1、MediaRecorder录音,MediaPlayer播放,使用的时候注意他们的生命周期。
林口ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
2、模拟器上播放声音是没问题的,pc外放能听的到
还有问题可以追问
网上有很多博客说添加IOS10之后新增的Notification Service Extension才可以推送Apns自定义铃声,实际上是不对的,简单的自定义语音推送IOS10之前就已经支持,而且APNS Server与deviceToken直接相关联,自然也不存在许多博客说的杀死App后接受不到推送的问题。
有关Notification Service Extension多媒体拓展问题可参考
本文提供简单的自定义语音推送解决方案。
修改苹果原生推送声音:
(1)App在后台或者被杀死时,服务器给你推送的userinfo中sound字段的value和你本地的声音文件名一致时,这样就可以播放你本地自定义的语音文件(mp3,wav等常见语音格式都可以支持)。
(2)App运行在前台时大部分App会关闭掉UNNotificationPresentationOptionSound权限,当你有类似美团接单,支付宝到账等需前台响铃的需求时需要自己写响铃方法,这里主要有两种解决方案。
方案1播放系统音效
将此方法在应用在前台处理推送的方法中调用,注意区分iOS10前后处理方法的不同。
方案2:AVAudioPlayer播放
单例一个AVAudioPlayer控制类
这里我们推荐使用第一种方法,通过系统方法进行播放。
Core Audio 是iOS和MAC系统中的关于数字音频处理的基础,它是应用程序用来处理音频的一组软件框架,所有关于iOS音频开发的接口都是由Core Audio来提供或者经过它提供的接口来进行封装的。
其实一句话,它是任何iOS或者MAC系统音频处理框架的基础。
具体可以用官方文档的一张图表示。
接下来我们就一起分析一下。
这里的高级别服务,更加接近于顶层,基本上我们很多关于音频开发的工作在这一层就可以完成。
它位于框架 AudioToolbox 中。
提供录制、播放、暂停、循环、和同步音频它自动采用必要的编解码器处理压缩的音频格式。
要在iOS设备上播放和录制音频,苹果推荐我们使用 AVFoundation 框架中的 AVAudioPlayer 和 AVAudioRecorder 类。虽然用法比较简单,但是不支持流式;这就意味着:在播放音频前,必须等到整个音频加载完成后,才能开始播放音频;录音时,也必须等到录音结束后,才能获取到录音数据。这给应用造成了很大的局限性。为了解决这个问题,我们就需要使用 Audio Queue Services 来播放和录制音频。感兴趣的可以看我前面写的几篇关于 Audio Queue Services 的文章。这里只是简单的给出录音和播放的原理图,具体原理和流程,看我前面写的那几篇,都有详细的介绍。
它位于框架 AVFoundation 中。
是专为IOS平台提供的基于Objective-C接口的音频播放类,可以支持iOS所支持的所有音频的播放,它主要支持以下音频格式。
这个是纯OC的实现,特点就是调用简单,下面简单的看一下他的API。
由 Audio File 与 Audio Converter 组合而成,提供压缩及无压缩音频文件的读写能力。
它与 Audio File Services 、 Audio File Stream Services 和 Audio Queue Services 等同时存在 AudioToolbox 框架中。 ExtendedAudioFile 相对 Audio File Services 和 Audio Converter Services ,API调用非常简单和明确,并且不需要去处理 AudioStreamPacketDescription ,在实际开发中逻辑更为清晰。
它就是存在框架 OpenAL 中。
是CoreAudio对OpenAL标准的实现,可以播放3D混音效果。
OpenAL 主要的功能是在来源物体、音效缓冲和收听者中编码。来源物体包含一个指向缓冲区的指标、声音的速度、位置和方向,以及声音强度。收听者物体包含收听者的速度、位置和方向,以及全部声音的整体增益。缓冲里包含 8 或 16 位元、单声道或立体声 PCM 格式的音效资料,表现引擎进行所有必要的计算,如距离衰减、多普勒效应等。
不同于 OpenGL 规格,OpenAL 规格包含两个API分支;以实际 OpenAL 函式组成的核心,和 ALC API , ALC 用于管理表现内容、资源使用情况,并将跨平台风格封在其中。还有 “ALUT ”程式库,提供高阶“易用”的函式,其定位相当于 OpenGL 的 GLUT 。
该层功能比较齐全,包括音频数据格式转换,音频文件读写,音频流解析,插件工作支持等。
它位于框架 AudioToolbox 中。
负责音频数据格式的转换
它位于框架 AudioToolbox 中。
负责音频数据的读写。
它位于框架 AudioToolbox 中。
支持均衡器和混音器等数字信号处理的插件。
它位于框架 AudioToolbox 中。
负责流解析。
它位于框架 Core Audio 中。
负责音频音频时钟同步。
该主要在MAC上的音频APP实现中并且需要最大限度的实时性能的情况下使用,大部分音频APP不需要使用该层的服务。而且,在iOS上也提供了具备较高实时性能的高层API达到你的需求。例如 OpenAL ,在游戏中具备与I/O直接调用的实时音频处理能力。
它在 IOKit 框架中,与硬件驱动交互。
获得用户空间访问硬件设备和驱动程序。 I / O Kit 框架通过设备接口机制实现对I / O Kit对象(驱动程序和结点)的非内核访问。
音频硬件抽象层,使API调用与实际硬件相分离,保持独立。
它位于 Core MIDI 框架中,与MIDI设备(如硬件键盘和合成器)进行通信。
Core MIDI 框架提供了用于与MIDI(乐器数字接口)设备(包括硬件键盘和合成器)进行通信的API。 使用基座连接器或网络从iOS设备进行连接。 有关使用基座连接器的更多信息,请参阅Apple的 MFi program 。
访问电脑硬件时钟。
只实现音频的播放,没有其他需求, AVAudioPlayer 就可以满足需求。它的接口使用简单,不用关心其中的细节,通常只提供给它一个播放源的URL地址,并且调用其play、pause、stop等方法进行控制,observer其播放状态更新UI即可。
APP需要对音频进行流播放,就需要 AudioFileStreamer 加 Audio Queue ,将网络或者本地的流读取到内存,提交给 AudioFileStreamer 解析分离音频帧,分离出来的音频帧可以送给 AudioQueue 进行解码和播放,可参考下面。
AudioStreamer
FreeStreamer
AFSoundManager
APP需要需要对音频施加音效(均衡器、混响器),就是除了数据的读取和解析以外还需要用到AudioConverter或者Codec来把音频数据转换成PCM数据,再由AudioUnit+AUGraph来进行音效处理和播放,可参考下面。
DouAudioStreamer
TheAmazingAudioEngine
AudioKit
1. iOS Audio Unit(一)
可能在软件某些时候需要震动手机以示提醒,可能还要播放一段特殊的声音引起用户的注意,在ios中如何实现呢?
首先实现震动,其实就是调用系统的方法,一句话就行,AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);当然前提是要加入AVFoundation.framework这个框架
然后实现播放声音,可能还要循环播放多少次,循环播放用n次,[self.player setNumberOfLoops:n];
因为我播放的声音是mp3,是用AudioToolbox框架,需要加入这个框架
代码如下
ViewController.h文件
#import
#import
#import
@interface ViewController : UIViewController{
AVAudioPlayer *player;
}
@property (retain) AVAudioPlayer *player;
@end
ViewController.m文件
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize player;
- (BOOL) prepAudio
{
NSError *error;
NSString *path = [[NSBundle mainBundle] pathForResource:@"loop" ofType:@"mp3"];
if (![[NSFileManager defaultManager] fileExistsAtPath:path]) return NO;
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:error];
if (!self.player)
{
NSLog(@"Error: %@", [error localizedDescription]);
return NO;
}
[self.player prepareToPlay];
[self.player setNumberOfLoops:1];
return YES;
}
- (void)viewDidLoad
{
[self prepAudio];
[self.player play];
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
}
@end
下载源代码
项目中应产品的需求,需给button添加点击声音。下面我总结了一下关于播放系统提示音和播放自定义声音的方法。
一:播放系统提示音。
第一步:首先得导入AudioToolbox框架 #importAudioToolbox/AudioToolbox.h
第二步:定义一个SystemSoundIDSystemSoundID soundID =1000;
AudioServicesPlaySystemSound(soundID);
SystemSoundID具体参数请参考 传送门
二:播放本地文件
//得到音效文件的地址
NSString*soundFilePath =[[NSBundlemainBundle]pathForResource:nameofType:type];
//将地址字符串转换成url
NSURL*soundURL = [NSURLfileURLWithPath:soundFilePath];
//生成系统音效id
AudioServicesCreateSystemSoundID((__bridgeCFURLRef)soundURL, soundFileObject);
//播放系统音效
AudioServicesPlaySystemSound(soundFileObject);