iOS 音频播放

//
//  HanAudioPlayer.h
//  HT-AVAudioPlayer
//
//  Created by han on 2022/8/2.
//

#import 
#import 
#import 

NS_ASSUME_NONNULL_BEGIN


@class HanAudioPlayer;

@protocol HanAudioPlayerDelegate 
@optional
///播放完成
- (void)audioPlayerDidFinishPlaying:(HanAudioPlayer *)player successfully:(BOOL)flag;
///解析音乐出错
- (void)audioPlayerDecodeErrorDidOccur:(HanAudioPlayer *)player error:(NSError * __nullable)error;

@end


@interface HanAudioPlayer : NSObject

@property (readonly,nonatomic, strong) AVAudioPlayer *audioPlayer;

@property (nonatomic, weak) id delegate;

/// 初始化 默认循环播放 最大音量一半播放
/// @param url 音乐地址
- (instancetype)initAudioPlayerWithURL:(NSString *)url;

/// 播放音乐
- (void)playRadio;

/// 播放音乐
/// @param url 音乐地址
- (void)playRadioWithURL:(NSString *)url;

/// 播放音乐
/// @param time 从什么位置播放
- (void)playRadioAtTime:(NSTimeInterval)time;

/// 暂停播放
- (void)pauseRadio;

/// 停止播放
- (void)stopRadio;

/// 播放次数
/// @param number 次数 -1循环播放
- (void)numberOfLoops:(NSInteger)number;

/// 播放音量
/// @param volume 音量 0-1
- (void)setVolume:(CGFloat)volume;


/// 设置外放
/// @param isSpeaker 是否外放
- (void)setSpeaker:(BOOL)isSpeaker;

@end

NS_ASSUME_NONNULL_END

//
//  HanAudioPlayer.m
//  HT-AVAudioPlayer
//
//  Created by han on 2022/8/2.
//

#import "HanAudioPlayer.h"
#import "HanAudioPlayer+FileManage.h"

@interface HanAudioPlayer ()

@property (nonatomic, strong) AVAudioPlayer *audioPlayer;

@end

@implementation HanAudioPlayer

- (instancetype)initAudioPlayerWithURL:(NSString *)url{
    if (self = [super init]) {
        [self loadAudioPlayerWithURL:url];
    }
    return self;
}

#pragma mark - public
- (void)playRadio{
    [self.audioPlayer play];
}

- (void)playRadioAtTime:(NSTimeInterval)time{
    [self.audioPlayer playAtTime:time];
}

- (void)numberOfLoops:(NSInteger)number{
    self.audioPlayer.numberOfLoops = number;
}

- (void)pauseRadio{
    [self.audioPlayer pause];
}

- (void)stopRadio{
    [self.audioPlayer stop];
    self.audioPlayer.currentTime = 0;
}

- (void)playRadioWithURL:(NSString *)url{
    [self loadAudioPlayerWithURL:url];
    [self playRadio];
}

- (void)setVolume:(CGFloat)volume{
    self.audioPlayer.volume = volume;
}
- (void)setSpeaker:(BOOL)isSpeaker{
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    if (isSpeaker) {
        [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
    }else{
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    }
    [audioSession setActive:YES error:nil];
}
#pragma mark - private
- (void)loadAudioPlayerWithURL:(NSString *)url{
    if (url.length != 0) {
        if (self.audioPlayer) {
            [self stopRadio];
            self.audioPlayer = nil;
        }
        NSData *data = [NSData data];
        BOOL isHave = [HanAudioPlayer fileIsExists:[HanAudioPlayer getAudioPath]];
        if (isHave) {
            data = [NSData dataWithContentsOfFile:[HanAudioPlayer getAudioPath]];
        }else{
            if ([url hasPrefix:@"https://"] || [url hasPrefix:@"http://"]) {
                NSURL *URL = [[NSURL alloc] initWithString:url];
                if (URL) {
                    data = [NSData dataWithContentsOfURL:URL];
                    __weak typeof(self) this = self;
                    [this saveAudio:data];
                    [this saveFileKey:url];
                }
            }else{
                if (![self fileIsExists:url]) {
                    return;
                }
                data = [NSData dataWithContentsOfFile:url];
            }
        }
        if (data.length > 0) {
            NSError *error;
            self.audioPlayer = [[AVAudioPlayer alloc] initWithData:data error:&error];
            self.audioPlayer.numberOfLoops = -1;
            self.audioPlayer.volume = 0.5;
            self.audioPlayer.delegate = self;
        }
        
    }
}

#pragma mark - AVAudioPlayerDelegate
///播放完成
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    if (self.delegate && [self.delegate respondsToSelector:@selector(audioPlayerDidFinishPlaying:successfully:)]) {
        [self.delegate audioPlayerDidFinishPlaying:self successfully:flag];
    }
}
///解析音乐出错
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError * __nullable)error{
    if (self.delegate && [self.delegate respondsToSelector:@selector(audioPlayerDecodeErrorDidOccur:error:)]) {
        [self.delegate audioPlayerDecodeErrorDidOccur:self error:error];
    }
}

@end

对音乐做本地处理

//
//  HanAudioPlayer+FileManage.h
//  HT-AVAudioPlayer
//
//  Created by han on 2022/8/2.
//

#import "HanAudioPlayer.h"

NS_ASSUME_NONNULL_BEGIN


@interface HanAudioPlayer (FileManage)

/// 文件是否存在
/// @param path 地址
- (BOOL)fileIsExists:(NSString *)path;
+ (BOOL)fileIsExists:(NSString *)path;

/// 保存fileKey
/// @param fileKey fileKey
-(void)saveFileKey:(NSString *)fileKey;

/// 保存音乐
/// @param audioData 音乐
- (void)saveAudio:(NSData *)audioData;

///Key路径
-(NSString *)getKeyPath;
+(NSString *)getKeyPath;

///Audio路径
-(NSString *)getAudioPath;
+(NSString *)getAudioPath;
@end

NS_ASSUME_NONNULL_END

//
//  HanAudioPlayer+FileManage.m
//  HT-AVAudioPlayer
//
//  Created by han on 2022/8/2.
//

#import "HanAudioPlayer+FileManage.h"

@implementation HanAudioPlayer (FileManage)
- (BOOL)fileIsExists:(NSString *)path{
    NSFileManager* fileManager = [NSFileManager defaultManager];
    BOOL isDirExist = [fileManager fileExistsAtPath:path
                                            isDirectory:nil];
    return isDirExist;
}
+ (BOOL)fileIsExists:(NSString *)path{
    return [[[self alloc] init] fileIsExists:path];
}
-(BOOL)createDirectory:(NSString*)audioPath
{
    NSFileManager* fileManager = [NSFileManager defaultManager];
    
    BOOL isDirExist = [fileManager fileExistsAtPath:audioPath
                                        isDirectory:nil];
    if(!isDirExist)
    {
        BOOL bCreateDir = [fileManager createDirectoryAtPath:audioPath
                                 withIntermediateDirectories:YES
                                                  attributes:nil
                                                       error:nil];
        
        if(!bCreateDir){
            
            NSLog(@"创建文件夹失败");
            return NO;
            
        }
    }
    return YES;
}
-(void)saveFileKey:(NSString *)fileKey{
    if (fileKey) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSData* stringData  = [[NSString stringWithFormat:@"%@",fileKey] dataUsingEncoding:NSUTF8StringEncoding];
            [stringData writeToFile:[self getKeyPath] atomically:YES];
        });
        
    }
}
-(void)saveAudio:(NSData *)audioData{
    if (audioData) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [audioData writeToFile:[self getAudioPath] atomically:YES];
        });
    }
}
-(NSData *)getAudioData{
    NSString *path = [self getAudioPath];
    NSData *data = [NSData dataWithContentsOfFile:path];
    return data;
}
///Key路径
-(NSString *)getKeyPath{
    NSArray *paths  = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    //获取文件路径
    NSString *theFilePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"/cs/key.txt"];
    
    return theFilePath;
}
+(NSString *)getKeyPath{
    return [[[self alloc] init] getKeyPath];
}
///Audio路径
-(NSString *)getAudioPath{
    NSArray *paths  = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    //获取文件路径
    NSString *theFilePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"/cs/waiting.wav"];
    
    return theFilePath;
}
+(NSString *)getAudioPath{
    return [[[self alloc] init] getAudioPath];
}
///CustomerService文件夹路径
-(NSString *)getCSPath{
    NSArray *paths  = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    //获取文件路径
    NSString *theFilePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"/cs/waiting.wav"];
    
    return theFilePath;
}
-(void)writeTextToPath:(NSString *)path withContent:(NSString *)content {
    if (content.length == 0) {
        return;
    }
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        @synchronized (self) {
            NSString *theFilePath = path;
            NSFileManager *fileManager = [NSFileManager defaultManager];
            if(![fileManager fileExistsAtPath:theFilePath]){
                NSString *str = @"";
                [str writeToFile:theFilePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
            }
            NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:theFilePath];
            [fileHandle seekToEndOfFile];
            NSData* stringData  = [[NSString stringWithFormat:@"%@",content] dataUsingEncoding:NSUTF8StringEncoding];
            [fileHandle writeData:stringData];
            [fileHandle closeFile];
        }
    });
}
///清空文件
-(void)clearFile{
    //获取文件路径
    NSString *theFilePath = [self getCSPath];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    [fileManager removeItemAtPath:theFilePath error:&error];
}
@end

你可能感兴趣的:(iOS 音频播放)