一、音频

在iOS中,音频播放从形式上能够分为音效播放和音乐播放。

* 音效:

* 主要指一些短音频的播放,这类音频一般不须要进行进度、循环等控制。

* 在iOS中。音效我们是使用AudioToolbox.framework框架实现。

* 音乐:

* 主要指一些较长的音频,通常须要对播放进行精确控制。

* 在iOS中,音乐我们是使用AVFoundation.framework框架实现。

二、音效

AudioToolbox.framework框架是一套基于C语言的框架

它的实现原理是将短音频注冊到系统声音服务(SystemSoundService)

系统声音服务的一些限制:
  1. 音频播放时间不能超过30s
  2. 数据必须是PCM或者IMA4格式,如今的基本都符合
  3. 音频文件必须是CAF、AIF、WAV的一种,实际上有些MP3格式也能够播放。
使用步骤:
  1. 导入AudioToolbox.framework框架,加入头文件:
#import <AudioToolbox/AudioToolbox.h>
  1. 获取音效文件的路径URL
  2. 加入进系统声音服务,获得系统声音ID。ID是区分不同音效的唯一标示
void AudioServicesCreateSystemSoundID(
CFURLRef inFileURL, /* 音效文件URL,须要把NSURL桥接成CGURLRef */
SystemSoundID *outSystemSoundID /* 返回音效唯一标示ID */
);
  1. 假设须要监听音效播放完毕,须要绑定回调函数
void AudioServicesAddSystemSoundCompletion(
SystemSoundID inSystemSoundID, /* 音效ID */
CFRunLoopRef inRunLoop, /* 所在循环,一般为NULL */
CFStringRef inRunLoopMode,/* 循环模式,一般为NULL */
void (*)(SystemSoundID,void*) inCompletionRoutine,/* 回调C语言函数指针 */
void *inClientData /* 回调函数的參数 */
);
  1. 開始播放,有两种播放模式:
/* 開始播放音效 */
void AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID);
/* 開始播放音效并带震动 */
void AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID);
以下是使用实例:
- (void)viewDidLoad{
[super viewDidLoad];
[self playSoundEffect:@"bellTone.wav"];
}
#pragma mark -音效
/* 音效播放完毕的回调函数,这个是C语言函数,第一个參数是音效ID,第二个是万能參数 */
void soundCompleteCallBack(SystemSoundID soundID, void *clientData)
{
NSLog(@"播放完毕");
}
- (void)playSoundEffect:(NSString *)name {
//获取音效文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:name ofType:nil];
//创建音效文件URL
NSURL *fileUrl = [NSURL URLWithString:filePath];
//音效声音的唯一标示ID
SystemSoundID soundID = 0;
//将音效加入到系统音效服务中。NSURL须要桥接成CFURLRef。会返回一个长整形ID,用来做音效的唯一标示
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(fileUrl), &soundID);
//设置音效播放完毕后的回调C语言函数
AudioServicesAddSystemSoundCompletion(soundID,NULL,NULL,soundCompleteCallBack,NULL);
//開始播放音效
AudioServicesPlaySystemSound(soundID);
}

三、音乐

假设播放较大的音频,须要对其进行精确控制,我们须要使用到另外一个框架。即:

AVFoundation.framework框架,它支持多种音频格式,能够进行精确控制。

音乐播放功能我们使用到的是AVFoundation.frameworkAVAudioPlayer音乐播放器来实现。

以下有一些AVAudioPlayer类的经常使用属性:
@property (readonly, getter=isPlaying) BOOL playing;//是否正在播放
@property NSTimeInterval currentTime;//当前已经播放的时间
@property (readonly) NSTimeInterval duration;//播放的总时间
@property float volume;//音量大小
@property float rate;//播放速率,默觉得1.0
@property (readonly) NSURL *url;//音乐文件的URL
以下是经常使用的对象方法:
/* 初始化方法 */
- (instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;
- (BOOL)prepareToPlay;/* 把音乐文件载入到缓存区 */
- (BOOL)play;/* 開始播放音乐 */
- (BOOL)playAtTime:(NSTimeInterval)time;/* 在指定时间開始播放音乐 */
- (void)pause;/* 中断音乐,能够通过调用play方法继续播放 */
- (void)stop;/* 终止音乐。无法继续播放 */
经常使用的代理方法:
/* 播放完毕时调用 */
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
/* 音频解码错误发生时调用 */
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;
使用步骤:
  1. 导入AVFoundation.framework框架,加入头文件:
#import <AVFoundation/AVFoundation.h>
  1. 获取音乐文件的本地文件路径URL。不能使用网络URL
  2. 创建音乐播放器对象AVAudioPlayer,并设置属性和代理。

  3. 调用perpareToPlay方法载入音乐文件到缓冲区
  4. 调用play方法播放。调用pause中断播放
  5. 实现AVAudioPlayerDelegate方法,监听播放完毕。
我们来做个简易的音乐播放器吧:
  1. 能够循环播放音乐
  2. 能够中断音乐
  3. 能够切换不同的音乐
  4. 能够知道播放进度
以下是详细的简易音乐播放器项目代码:
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h> @interface ViewController () <AVAudioPlayerDelegate> @property (nonatomic, strong) NSArray *musicArray;/*< 音乐列表 */
@property (nonatomic, strong) IBOutlet UIProgressView *progress;/*< 进度条 */
@property (nonatomic, strong) AVAudioPlayer *audioPlayer;/*< 音乐播放器对象 */
@property (nonatomic, strong) NSTimer *timer;/* 定时器 */
@property (nonatomic, strong) IBOutlet UILabel *titleLabel;/* 显示标题 */
@property (nonatomic, assign) NSInteger selectMusic;/* 当前播放音乐的索引 */ @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//音乐文件列表
self.musicArray = @[@"大梦想家",@"江南",@"酒干倘卖无",
@"泡沫",@"夏洛特烦恼",@"演员"];
//创建定时器,用于不断更新进度条
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.5
target:self
selector:@selector(updataProgress)
userInfo:nil
repeats:YES];
//创建播放器
[self initAudioPlayerWithNumber:0];
//播放器開始播放音乐
[self.audioPlayer play];
}
/* 初始化播放器 */
- (void)initAudioPlayerWithNumber:(NSInteger)num{
if (num >= self.musicArray.count) {
return;
}
//获取音乐文件路径
NSString *name = self.musicArray[num];
NSString *filePath = [[NSBundle mainBundle] pathForResource:name
ofType:@"mp3"];
//创建音乐文件URL。必须是fileURLWithPath,AVAudioPlayer不支持HTTP的URL
NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
//创建播放器
NSError *error = nil;
AVAudioPlayer *audioPlayer =
[[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:&error];
if (error) {
NSLog(@"初始化播放器错误,错误:%@",error.localizedDescription);
return;
}
audioPlayer.numberOfLoops = 0;//设置循环次数,0表示不循环
audioPlayer.delegate = self;//设置代理
[audioPlayer prepareToPlay];//载入音乐文件到缓存,还不会播放 self.selectMusic = num;//保存当前的音乐索引
self.audioPlayer = audioPlayer;//保存当前播放器
self.titleLabel.text = name;//设置标题
}
/* 进度条更新方法,每0.5秒更新一次 */
- (void)updataProgress{
//currentTime是当前播放时间,duration是播放总时长
CGFloat progress = self.audioPlayer.currentTime / self.audioPlayer.duration;
[self.progress setProgress:progress animated:YES];
}
/* 点击播放button */
- (IBAction)musicPlay:(id)sender {
//假设播放器没有在播放,才须要调用播放方法
if (![self.audioPlayer isPlaying]) {
[self.audioPlayer play];
//恢复定时器
self.timer.fireDate = [NSDate distantPast];
}
}
/* 点击暂停button */
- (IBAction)musicPause:(id)sender {
//假设播放器在播放,才须要调用暂停方法
if ([self.audioPlayer isPlaying]) {
[self.audioPlayer pause];
//停止定时器
self.timer.fireDate = [NSDate distantFuture];
}
}
/* 点击下一首歌button */
- (IBAction)next:(id)sender {
//音乐索引循环递增
self.selectMusic = (self.selectMusic + 1)%self.musicArray.count;
//又一次设置播放器
[self initAudioPlayerWithNumber:self.selectMusic];
//播放器播放
[self.audioPlayer play];
}
#pragma mark - AVAudioPlayerDelegate代理方法
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
//自己主动跳转播放下一首歌
[self next:nil];
}



(⊙﹏⊙)b,也是够简陋的,你能够做精美一点,比方假设每首歌相应一个图片。到时候切歌的时候,图片显示在背景,一定赏心悦目多了,O(∩_∩)O~,我没有找到好的图片,就这样吧。

四、后台播放音乐

其实上面的播放器有一点问题,那就是一旦进入后台。我们的音乐器就自己主动暂停了,不能够/(ㄒoㄒ)/~~!那该怎么办呢?

1. 设置后台执行模式

设置info.plist文件,加入字段Required background modes

并设置App plays audio or streams audio/video using AirPlay

2. 使用音频会话。设置后台执行类型
//获取音频会话单例对象
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
//设置会话为后台播放
[audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL];
//激活改动。启动会话
[audioSession setActive:YES error:NULL];

音频会话除了后台播放外。还能够有以下的播放模式:

上面的代码仅仅需改动初始化播放器方法就可以实现后台播放:
/* 初始化播放器 */
- (void)initAudioPlayerWithNumber:(NSInteger)num{
if (num >= self.musicArray.count) {
return;
}
//获取音乐文件路径
NSString *name = self.musicArray[num];
NSString *filePath = [[NSBundle mainBundle] pathForResource:name
ofType:@"mp3"];
//创建音乐文件URL。必须是fileURLWithPath,AVAudioPlayer不支持HTTP的URL
NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
//创建播放器
NSError *error = nil;
AVAudioPlayer *audioPlayer =
[[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:&error];
if (error) {
NSLog(@"初始化播放器错误,错误:%@",error.localizedDescription);
return;
}
audioPlayer.numberOfLoops = 0;//设置循环次数,0表示不循环
audioPlayer.delegate = self;//设置代理
[audioPlayer prepareToPlay];//载入音乐文件到缓存,还不会播放 //获取音频会话单例对象
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
//设置会话为后台播放
[audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL];
//激活改动,启动会话
[audioSession setActive:YES error:NULL]; self.selectMusic = num;//保存当前的音乐索引
self.audioPlayer = audioPlayer;//保存当前播放器
self.titleLabel.text = name;//设置标题
}

这样,我们就能够后台播放了。(^o^)/~。

有什么问题能够在下方评论区出去。好意见我会採纳的,打造一个大家都惬意的学习笔记,O(∩_∩)O哈!

iOS学习笔记23-音效与音乐的更多相关文章

  1. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  2. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  3. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  4. iOS学习笔记22-推送通知

    一.推送通知 推送通知就是向用户推送一条信息来通知用户某件事件,可以在应用退到后台后,或者关闭后,能够通过推送一条消息通知用户某件事情,比如版本更新等等. 推送通知的常用应用场景: 一些任务管理APP ...

  5. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  6. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  7. IOS学习笔记之关键词@dynamic

    IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...

  8. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

  9. iOS学习笔记之Category

    iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...

随机推荐

  1. 我们应选择怎样的IT公司

    最近经常有朋友提问,同时收到几家公司的offer,应该如何选择,或者找工作的时候,找怎样的公司,我在这里阐述一下我的观点.但愿对朋友们有所帮助. 还是那句老话,选择什么样的公司,关键是你想要过什么样的 ...

  2. Win10系统解决C盘分区限制一半的问题

    1,按照网上的方法还不行,如链接 2,安装如下软件,里面有激活码,链接 链接:https://pan.baidu.com/s/14ifYpnCMGwJIbgykTYQR6Q 密码:whh3 3,安装并 ...

  3. 【互动问答分享】第7期决胜云计算大数据时代Spark亚太研究院公益大讲堂

    “决胜云计算大数据时代” Spark亚太研究院100期公益大讲堂 [第7期互动问答分享] Q1:Spark中的RDD到底是什么? RDD是Spark的核心抽象,可以把RDD看做“分布式函数编程语言”. ...

  4. Spark部署及应用

    在飞速发展的云计算大数据时代,Spark是继Hadoop之后,成为替代Hadoop的下一代云计算大数据核心技术,目前Spark已经构建了自己的整个大数据处理生态系统,如流处理.图技术.机器学习.NoS ...

  5. UESTC 30.最短路-最短路(Floyd or Spfa(链式前向星存图))

    最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...

  6. POJ 1776 Task Sequences(竞赛图构造哈密顿通路)

    链接:http://poj.org/problem?id=1776 本文链接:http://www.cnblogs.com/Ash-ly/p/5458635.html 题意: 有一个机器要完成一个作业 ...

  7. hdu6070

    hdu6070 题意 给出 \(n\) 个数, \(\frac{x}{y}\) 表示某个区间不同数的个数除以区间的长度,求 \(\frac{x}{y}\) 最小值. 分析 设 \(size(l, r) ...

  8. NOIP2018提高组模拟题(六)

    购物(shop) Description 小林来到商店中进行购物.商店里一共有 n 件物品,第 i 件物品的价格为 a[i] 元.小林总共需要购买 m 件物品,他希望他所花费的钱最少,请你计算出最小 ...

  9. 一个Sqrt函数引发的血案

    源码下载地址:http://diducoder.com/sotry-about-sqrt.html 好吧,我承认我标题党了,不过既然你来了,就认真看下去吧,保证你有收获. 我们平时经常会有一些数据运算 ...

  10. 1.5 JSP标准标签库(JSTL)(核心标签 out、set、remove、if、choose、forEach、forTokens、redirect)

    JSTL(JavaServer Page Standard Tag  Library):JSP标准标签库.它封装了JSP应用的通用核心功能. 1.准备工作 使用JSTL前需要下载所需文件,下载地址及安 ...