iOS开发——高级篇——音频、音乐播放(封装类)
一、简介
简单来说,音频可以分为2种
音效
又称“短音频”,通常在程序中的播放时长为1~2秒
在应用程序中起到点缀效果,提升整体用户体验
音乐
比如游戏中的“背景音乐”,一般播放时间较长
播放音频可以使用框架
AVFoundation.framework
二、音效
1、音效的播放
// 1.获得音效文件的路径
NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil]; // 2.加载音效文件,得到对应的音效ID
SystemSoundID soundID = ;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
// 3.播放音效
// 播放音效的同时有震动效果
AudioServicesPlayAlertSound(soundID);
// 仅仅是播放音效
// AudioServicesPlaySystemSound(soundID);
音效文件只需要加载1次
2、音效播放常见函数总结
加载音效文件
AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)
释放音效资源
AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)
播放音效
AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)
播放音效带点震动
AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)
三、音乐
1、音乐的播放
音乐播放用到一个叫做AVAudioPlayer的类
AVAudioPlayer常用方法
加载音乐文件
- (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;
- (id)initWithData:(NSData *)data error:(NSError **)outError;
准备播放(缓冲,提高播放的流畅性)
- (BOOL)prepareToPlay;
播放(异步播放)
- (BOOL)play;
暂停
- (void)pause;
停止
- (void)stop;
是否正在播放
@property(readonly, getter=isPlaying) BOOL playing;
时长
@property(readonly) NSTimeInterval duration;
当前的播放位置
@property NSTimeInterval currentTime;
播放次数(-1代表无限循环播放,其他代表播放numberOfLoops+1次)
@property NSInteger numberOfLoops;
音量
@property float volume;
是否允许更改速率
@property BOOL enableRate;
播放速率(1是正常速率,0.5是一般速率,2是双倍速率)
@property float rate;
有多少个声道
@property(readonly) NSUInteger numberOfChannels;
声道(-1是左声道,1是右声道,0是中间)
@property float pan;
是否允许测量音量
@property(getter=isMeteringEnabled) BOOL meteringEnabled;
更新测量值
- (void)updateMeters;
获得当前的平均音量
- (float)averagePowerForChannel:(NSUInteger)channelNumber;
四、录音
/** 录音对象 */
@property (nonatomic, strong) AVAudioRecorder *recorder; #pragma mark - 录制的控制
- (IBAction)startRecorder {
[self.recorder record];
} - (IBAction)stopRecorder {
[self.recorder stop];
} #pragma mark - 懒加载代码
- (AVAudioRecorder *)recorder
{
if (_recorder == nil) {
// 1.获取音频存放的路径
// 1.1.URL决定的录制的音频的存放的位置
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; // 1.2.拼接一个音频的文件名称
NSString *filePath = [path stringByAppendingPathComponent:@"123.caf"]; // 1.3.将路径转成URL
NSURL *url = [NSURL fileURLWithPath:filePath]; // 2.设置音频的相关格式:settings : 决定音频的格式/采样率
NSDictionary *setttings = @{
AVFormatIDKey : @(kAudioFormatLinearPCM),
AVSampleRateKey : @()}; // 3.创建录音对象
self.recorder = [[AVAudioRecorder alloc] initWithURL:url settings:setttings error:nil];
}
return _recorder;
}
五、播放音乐(抽取工具类)
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h> @interface CHGAudioTool : NSObject /**
* 根据音效文件名开始播放音效
*
* @param soundName 音效名称
*/
+ (void)playSoundWithSoundName:(NSString *)soundName; /**
* 根据音乐文件名开始播放音乐 返回播放器
*
* @param musicName 音乐名称
*/
+ (AVAudioPlayer *)playMusicWithMusicName:(NSString *)musicName; /**
* 根据音乐文件名暂停播放音乐
*
* @param musicName 音乐名称
*/
+ (void)pauseMusicWithMusicName:(NSString *)musicName; /**
* 根据音乐文件名停止播放音乐
*
* @param musicName 音乐名称
*/
+ (void)stopMusicWithMusicName:(NSString *)musicName; @end
实现
#import "CHGAudioTool.h" @implementation CHGAudioTool static NSMutableDictionary *_soundIDs;
static NSMutableDictionary *_players; + (void)initialize
{
_soundIDs = [NSMutableDictionary dictionary];
_players = [NSMutableDictionary dictionary];
} // 播放音频
+ (void)playSoundWithSoundName:(NSString *)soundName
{
// 1.从字典中取出之前保存的soundID
SystemSoundID soundID = [[_soundIDs objectForKey:soundName] unsignedIntValue]; // 2.如果取出为0,表示之前没有加载当前声音
if (soundID == ) {
// 2.1.根据资源文件加载soundID
CFURLRef url = (__bridge CFURLRef)[[NSBundle mainBundle] URLForResource:soundName withExtension:nil];
AudioServicesCreateSystemSoundID(url, &soundID); // 2.2.存入字典
[_soundIDs setObject:@(soundID) forKey:soundName];
} // 3.播放声音
AudioServicesPlaySystemSound(soundID);
} // 开始播放音乐
+ (AVAudioPlayer *)playMusicWithMusicName:(NSString *)musicName
{
// 1.从字典中取出之前保存的播放器
AVAudioPlayer *player = _players[musicName]; // 2.判断播放器是否为nil,如果为空,则创建播放器
if (player == nil) {
// 2.1.加载对应的资源
NSURL *url = [[NSBundle mainBundle] URLForResource:musicName withExtension:nil]; // 2.2.创建播放器
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; // 2.3.将播放器存入字典
[_players setObject:player forKey:musicName];
} // 3.播放音乐
[player play]; return player;
} // 暂停播放音乐
+ (void)pauseMusicWithMusicName:(NSString *)musicName
{
// 1.从字典中取出之前保存的播放器
AVAudioPlayer *player = _players[musicName]; // 2.判断播放器是否为空,如果不为空,则暂停
if (player) {
[player pause];
}
} // 停止播放音乐
+ (void)stopMusicWithMusicName:(NSString *)musicName
{
// 1.从字典中取出之前保存的播放器
AVAudioPlayer *player = _players[musicName]; // 2.判断播放器是否为空,如果不为空,则停止音乐
if (player) {
[player stop];
[_players removeObjectForKey:musicName];
}
} @end
抽取出这个工具类后,用法很简单
#import "CHGAudioTool.h"
// 开始播放
[CHGAudioTool playMusicWithMusicName:playingMusic.filename];
// 暂停播放
[CHGAudioTool pauseMusicWithMusicName:playingMusic.filename];
// 停止播放
[CHGAudioTool stopMusicWithMusicName:playingMusic.filename];
playingMusic.filename是你要操作的文件(比如: 小苹果.mp3)
iOS开发——高级篇——音频、音乐播放(封装类)的更多相关文章
- iOS开发拓展篇—音频处理(音乐播放器1)
iOS开发拓展篇—音频处理(音乐播放器1) 说明:该系列文章通过实现一个简单的音乐播放器来介绍音频处理的相关知识点,需要重点注意很多细节的处理. 一.调整项目的结构,导入必要的素材 调整后的项目结构如 ...
- iOS开发拓展篇—音频处理(音乐播放器2)
iOS开发拓展篇—音频处理(音乐播放器2) 说明:该文主要介绍音乐播放界面的搭建. 一.跳转 1.跳转到音乐播放界面的方法选择 (1)使用模态跳转(又分为手动的和自动的) (2)使用xib并设置跳转 ...
- iOS开发拓展篇—音频处理(音乐播放器3)
iOS开发拓展篇—音频处理(音乐播放器3) 说明:这篇文章主要介绍音频工具类和播放工具类的封装. 一.控制器间数据传递 1.两个控制器之间数据的传递 第一种方法:self.parentViewCont ...
- iOS开发拓展篇—音频处理(音乐播放器4)
iOS开发拓展篇—音频处理(音乐播放器4) 说明:该文主要介绍音乐播放器实现过程中的一些细节控制. 实现的效果: 一.完整的代码 YYPlayingViewController.m文件 // // Y ...
- iOS开发拓展篇—音频处理(音乐播放器5)
iOS开发拓展篇—音频处理(音乐播放器5) 实现效果: 一.半透明滑块的设置 /** *拖动滑块 */ - (IBAction)panSlider:(UIPanGestureRecognizer *) ...
- iOS开发拓展篇—音频处理(音乐播放器6)
iOS开发拓展篇—音频处理(音乐播放器6) 一.图片处理 说明: Aspect表示按照原来的宽高比进行缩放. Aspectfit表示按照原来的宽高比缩放,要求看到全部图片,后果是不能完全覆盖窗口,会留 ...
- iOS开发拓展篇—音效的播放
iOS开发拓展篇—音效的播放 一.简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中 ...
- iOS开发——高级篇——iOS开发之网络安全密码学
一.非对称加密 - RSA : + 公钥加密,私钥解密: + 私钥加密,公钥解密: + 只能通过因式分解来破解 二.对称加密 - DES - 3DES - AES (高级密码标准,美国国家安全局使用, ...
- iOS开发——高级篇——线程同步、线程依赖、线程组
前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查 ...
随机推荐
- NYOJ 762
容斥原理 http://blog.csdn.net/shiren_bod/article/details/5787722
- <<MySchool数据库设计优化>> 内部测试
1) 在SQL Server 中,为数据库表建立索引能够( C ). A. 防止非法的删除操作 B. 防止非法的插入操作 C. 提高查询性能 D. 节约数据库的磁盘空间 解析:索引的作用是通过使用索引 ...
- etl结合java的例子
1.新建Java测试类,导出Jar包,放在kettle目录中的libext文件中 package test; public class Test{ public static final String ...
- HTTP状态码对应
HTTP的状态码 对于状态码大家如果经常在线买东西就能知道,我们买了东西就会有个订单状态:出库.发货中.送达中.送达等,其实这些状态就是状态码,只不过这些状态码都是文字.HTTP 响应的时候也有状态码 ...
- webstrom live templates
javascript: 在live templates底部要选择javascript # $('#$END$') $ $($end$) $bd $(document.body) $d $(docume ...
- VMware 设备VMnet0 上的网桥暂时关闭。此虚拟机无法与主机或网格中的其他计算机通信【转】
今天克隆了一个win7的虚拟机,移动到我的本地.打开时发现虚拟机网格连接图标出现X断开连接,于是网上收了一堆答案无一个可用的,决定自己解决这个问题,解决过程如下: 1.报错图如下:设备VMnet0 上 ...
- 新的一年快开始了,学点新东西吧,从React开始(一)
ReactJS是Facebook出的前端View框架,好东西啊. 看看它的说明: 仅仅是UI 许多人使用React作为MVC架构的V层. 尽管React并没有假设过你的其余技术栈, 但它仍可以作为一个 ...
- SharePoint下载服务器资源
使用IE浏览器
- 软件工程(FZU2015)赛季得分榜,第一回合
目录 第一回合 第二回合 第三回合 第四回合 第五回合 第6回合 第7回合 第8回合 第9回合 第10回合 第11回合 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分 ...
- socket编程知识
Socket语法及相关: Socket Familile(地址簇) socket.AF_UNIX unix本机进程间通信 socket.AF_INET IPV4 经常用的还是这里 so ...