音乐/音效之工具类的封装

时间:2022-07-28 19:47:54

您好。

今天。虾米主要还是实现一个关于音频/音效的工具类的封装。 也是为之后能写一个关于音乐播放器做的一层简单的封装。

不过主要目的还是在类的封装上。

如果有哪些需要改进的,请留下您的建议或联系虾米。再次感谢!!^-^



本人用一个继承自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