iOS开发—音频的播放的简单介绍和封装工具类
iOS开发—音频的播放的简单介绍和封装工具类
一、音效的播放简单介绍
简单来说,音频可以分为2种
(1)音效
又称“短音频”,通常在程序中的播放时长为1~2秒
在应用程序中起到点缀效果,提升整体用户体验
(2)音乐
比如游戏中的“背景音乐”,一般播放时间较长
框架:播放音频需要用到AVFoundation.framework框架
二、音效的播放
1.获得音效文件的路径
NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil];
2.加载音效文件,得到对应的音效ID
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
3.播放音效
AudioServicesPlaySystemSound(soundID);
注意:音效文件只需要加载1次
4.音效播放常见函数总结
加载音效文件
AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)
释放音效资源
AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)
播放音效
AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)
播放音效带点震动
AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)
三、程序示例
先导入需要依赖的框架
导入需要播放的音效文件素材
说明:AVFoundation.framework框架中的东西转换为CF需要使用桥接。
四、音乐播放简单说明
音乐播放用到一个叫做AVAudioPlayer的类,这个类可以用于播放手机本地的音乐文件。
注意:
(1)该类(AVAudioPlayer)只能用于播放本地音频。
(2)时间比较短的(称之为音效)使用AudioServicesCreateSystemSoundID来创建,而本地时间较长(称之为音乐)使用AVAudioPlayer类。
AVAudioPlayer类依赖于AVFoundation框架,因此使用该类必须先导入AVFoundation框架,并包含其头文件(包含主头文件即可)。
注意:一个AVAudioPlayer只能播放一个url,如果想要播放多个文件,那么就得创建多个播放器。
六、播放多个文件
点击,url,按住common建查看。
可以发现,这个url是只读的,因此只能通过initWithContentsOfUrl的方式进行设置,也就意味着一个播放器对象只能播放一个音频文件。
那么如何实现播放多个音频文件呢?
可以考虑封装一个播放音乐的工具类
七、封装音频文件播放工具类
简单说明
1.关于音乐播放的简单说明
(1)音乐播放用到一个叫做AVAudioPlayer的类
(2)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;
2.播放多个音乐文件
说明:如果要播放多个音乐文件,那么最傻瓜的做法是,创建多个全局的播放器去播放对应的音乐文件,但是这种方法无法适用于需要播放的文件数量巨大的情况。
另外一种做法是:自己封装一个播放音乐文件的工具类。
封装工具类的实现步骤:
新建一个类,继承自NSObject类。提供三个对外的接口:
分别是:
播放音乐(参数:文件名,返回值:BOOL)
暂停音乐(参数:文件名)
停止音乐(参数:文件名)
该工具类中的代码设计如下:
TXAudioTool.h文件
// TXAudioTool.h // 梁镋鑫的框架 // // Created by 鑫 on 14/11/28. // Copyright (c) 2014年 梁镋鑫. All rights reserved. // //播放音频工具类 #import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> @interface TXAudioTool : NSObject /** * 播放音效 * * @param filename 音效文件名 */ + (void)playSound:(NSString *)filename; /** * 销毁音效 * * @param filename 音效文件名 */ + (void)disposeSound:(NSString *)filename; /** * 播放音乐 * * @param filename 音乐文件名 */ + (AVAudioPlayer *)playMusic:(NSString *)filename; /** * 暂停音乐 * * @param filename 音乐文件名 */ + (void)pauseMusic:(NSString *)filename; /** * 停止音乐 * * @param filename 音乐文件名 */ + (void)stopMusic:(NSString *)filename; /** * 返回当前正在播放的音乐播放器 */ + (AVAudioPlayer *)currentPlayingAudioPlayer; @end
TXAudioTool.m文件
// // TXAudioTool.m // 梁镋鑫的框架 // // Created by 鑫 on 14/11/28. // Copyright (c) 2014年 梁镋鑫. All rights reserved. //播放音频工具类 #import "TXAudioTool.h" #import <AVFoundation/AVFoundation.h> @implementation TXAudioTool /** * 存放所有的音频ID * 字典: filename作为key, soundID作为value */ static NSMutableDictionary *_soundIDDict; /** * 存放所有的音乐播放器 * 字典: filename作为key, audioPlayer作为value */ static NSMutableDictionary *_audioPlayerDict; /** * 初始化 */ + (void)initialize { _soundIDDict = [NSMutableDictionary dictionary]; _audioPlayerDict = [NSMutableDictionary dictionary]; // 设置音频会话类型 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategorySoloAmbient error:nil]; [session setActive:YES error:nil]; } /** * 播放音效 * * @param filename 音效文件名 */ + (void)playSound:(NSString *)filename { if (!filename) return; // 1.从字典中取出soundID SystemSoundID soundID = [_soundIDDict[filename] unsignedLongValue]; if (!soundID) { // 创建 // 加载音效文件 NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:nil]; if (!url) return; // 创建音效ID AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &soundID); // 放入字典 _soundIDDict[filename] = @(soundID); } // 2.播放 AudioServicesPlaySystemSound(soundID); } /** * 销毁音效 * * @param filename 音效文件名 */ + (void)disposeSound:(NSString *)filename { if (!filename) return; SystemSoundID soundID = [_soundIDDict[filename] unsignedLongValue]; if (soundID) { // 销毁音效ID AudioServicesDisposeSystemSoundID(soundID); // 从字典中移除 [_soundIDDict removeObjectForKey:filename]; } } /** * 播放音乐 * * @param filename 音乐文件名 */ + (AVAudioPlayer *)playMusic:(NSString *)filename { if (!filename) return nil; // 1.从字典中取出audioPlayer AVAudioPlayer *audioPlayer = _audioPlayerDict[filename]; if (!audioPlayer) { // 创建 // 加载音乐文件 NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:nil]; if (!url) return nil; // 创建audioPlayer audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; // 缓冲 [audioPlayer prepareToPlay]; // audioPlayer.enableRate = YES; // audioPlayer.rate = 10.0; // 放入字典 _audioPlayerDict[filename] = audioPlayer; } // 2.播放 if (!audioPlayer.isPlaying) { [audioPlayer play]; } return audioPlayer; } /** * 暂停音乐 * * @param filename 音乐文件名 */ + (void)pauseMusic:(NSString *)filename { if (!filename) return; // 1.从字典中取出audioPlayer AVAudioPlayer *audioPlayer = _audioPlayerDict[filename]; // 2.暂停 if (audioPlayer.isPlaying) { [audioPlayer pause]; } } /** * 停止音乐 * * @param filename 音乐文件名 */ + (void)stopMusic:(NSString *)filename { if (!filename) return; // 1.从字典中取出audioPlayer AVAudioPlayer *audioPlayer = _audioPlayerDict[filename]; // 2.暂停 if (audioPlayer.isPlaying) { [audioPlayer stop]; // 直接销毁 [_audioPlayerDict removeObjectForKey:filename]; } } /** * 返回当前正在播放的音乐播放器 */ + (AVAudioPlayer *)currentPlayingAudioPlayer { for (NSString *filename in _audioPlayerDict) { AVAudioPlayer *audioPlayer = _audioPlayerDict[filename]; if (audioPlayer.isPlaying) { return audioPlayer; } } return nil; } @end
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。