您好。
今天。虾米主要还是实现一个关于音频/音效的工具类的封装。 也是为之后能写一个关于音乐播放器做的一层简单的封装。
不过主要目的还是在类的封装上。
如果有哪些需要改进的,请留下您的建议或联系虾米。再次感谢!!^-^
本人用一个继承自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