您好。
今天。虾米主要还是实现一个关于音频/音效的工具类的封装。 也是为之后能写一个关于音乐播放器做的一层简单的封装。
不过主要目的还是在类的封装上。
如果有哪些需要改进的,请留下您的建议或联系虾米。再次感谢!!^-^
本人用一个继承自NSObjec的JHAudioTool类,并提供关于音乐/音效文件的程序接口。实现代码如下:
// // JHAudioTool.h // AVAudioPlayer // // Created by cjj on 15-10-3. // Copyright (c) 2015年 jh.chen. All rights reserved. // #import <Foundation/Foundation.h> @interface JHAudioTool : NSObject /** 播放音乐*/ + (BOOL) playMusic:(NSString *)filename; /** 暂停音乐*/ +(void) pauseMusic:(NSString *)filename; /** 停止音乐*/ +(void) stopMusic:(NSString *)filename; /** 播放音效*/ + (void)playSound:(NSString *)filename; /** 销毁音效*/ + (void)disposeSound:(NSString *)filename; @end // // JHAudioTool.m // AVAudioPlayer // // Created by cjj on 15-10-3. // Copyright (c) 2015年 jh.chen. All rights reserved. // #import "JHAudioTool.h" #import <AVFoundation/AVFoundation.h> @implementation JHAudioTool /** * 用字典存放所有的音乐播放器 */ static NSMutableDictionary *_musicPlays; + (NSMutableDictionary *) musicPlayers { if (_musicPlays == nil) { _musicPlays = [NSMutableDictionary dictionary]; } return _musicPlays; } /** * 用字典存放所有的音效 */ static NSMutableDictionary *_soundIDs; + (NSMutableDictionary *)soundIDs { if (_soundIDs == nil) { _soundIDs = [NSMutableDictionary dictionary]; } return _soundIDs; } /** 播放音乐 * @param filename 音乐的文件名 */ + (BOOL)playMusic:(NSString *)filename { if(filename == nil) return NO; // 1.取出对应的播放器 AVAudioPlayer *player = [self musicPlayers][filename]; // 2.播放器没有创建,进行初始化 if(player == nil) { NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:nil]; if(url == nil) return NO; player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; // 缓冲 if (![player prepareToPlay]) return NO; // 将播放器存到字典中 [self musicPlayers][filename] = player; } // 3.播放 if (![player isPlaying]) { return [player play]; } return YES; } /** 暂停音乐*/ + (void)pauseMusic:(NSString *)filename { if(filename == nil) return; // 取出对应的音乐播放器 AVAudioPlayer *player = [self musicPlayers][filename]; if (player.isPlaying) { [player pause]; } } /** 停止音乐*/ + (void)stopMusic:(NSString *)filename { if(filename == nil) return; // 取出对应的音乐播放器 AVAudioPlayer *player = [self musicPlayers][filename]; [player stop]; // 将播放器从字典中移除 [[self musicPlayers] removeObjectForKey:filename]; } /** 播放音效*/ + (void)playSound:(NSString *)filename { if(filename == nil) return; // 通过字典属性取出对应的音效ID SystemSoundID soundID = [[self soundIDs][filename ] unsignedLongValue]; // 初始化 if (!soundID) { NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:nil]; if(url == nil) return; AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID); // 存入字典 [self soundIDs][filename] = @(soundID); } // 播放 AudioServicesPlayAlertSound(soundID); } /** 销毁音效*/ + (void)disposeSound:(NSString *)filename; { if(filename == nil) return; // 取出对应的音效ID SystemSoundID soundID = [[self soundIDs][filename] unsignedLongValue]; // 销毁 if (soundID) { AudioServicesDisposeSystemSoundID(soundID); [[self soundIDs] removeObjectForKey:filename]; } } @end
实现工具类的方法后,我们要将其运用到我们的项目当中。
虾米用简单的用几个按钮写了一个小demo,实现代码如下:
// // JHViewController.m // AVAudioPlayer // // Created by cjj on 15-10-2. // Copyright (c) 2015年 jh.chen. All rights reserved. // #import "JHViewController.h" #import "JHAudioTool.h" @interface JHViewController () @property (nonatomic, strong) NSArray *songs; @property (nonatomic, assign) int currentIndex; /** 播放音乐*/ - (IBAction)play; /** 暂停音乐*/ - (IBAction)pause; /** 停止音乐*/ - (IBAction)stop; /** 下一首歌曲*/ - (IBAction)next; @end @implementation JHViewController -(NSArray *)songs { if (_songs == nil) { self.songs = @[@"美人鱼.mp3",@"AlwaysOnline.mp3"]; } return _songs; } - (void)viewDidLoad { [super viewDidLoad]; [JHAudioTool playMusic:self.songs[self.currentIndex]]; } /** 播放音乐*/ - (IBAction)play { [JHAudioTool playMusic:self.songs[self.currentIndex]]; } /** 暂停音乐*/ - (IBAction)pause { [JHAudioTool pauseMusic:self.songs[self.currentIndex]]; } /** 停止音乐*/ - (IBAction)stop { [JHAudioTool stopMusic:self.songs[self.currentIndex]]; } - (IBAction)next { // 停掉之前的歌曲 [self stop]; // 开始下一首歌曲 增加索引 self.currentIndex ++; if (self.currentIndex >= self.songs.count) { self.currentIndex = 0; } // 开始播放 [self play]; } @end