01.音频播放 音频播放

@(iOS Study)[音视频播放]


目录

  • 01.音频播放 音频播放知识点
    • 音频播放
  • 1.AVFoundation框架
  • 2.实现录音功能
    • 简单使用AVAudioRecorder实现录音功能
  • 3.使用SystemSoundID播放音效
    • 使用SystemSoundID播放音效
    • 封装使用SystemSoundID播放音效工具类
  • 4.使用AVAudioPlayer播放器播放音乐

音频播放

1.AVFoundation框架

  • 可以进行录音
  • 播放音效(短暂音频)
  • 播放音乐(一首完整的歌)(本地/远程)
  • 播放视频(本地/远程)

2.实现录音功能

简单使用AVAudioRecorder实现录音功能

  • 录音功能实现步骤
    • 1.设置录音文件存放的url,音频相关参数
      • 1.1 要保存的路径(沙盒路径)
      • 1.2 拼接全路径, caf是录音文件的格式,如mp3
      • 1.3 创建url
      • 1.4 设置setting
    • 2.创建录音对象
    • 3.开始录音
      [self.recorder record];
    • 4.停止录音
      [self.recorder stop];
#pragma mark - 懒加载
// REMARKS: 简单使用AVAudioRecorder实现录音功能
- (AVAudioRecorder *)recorder
{
    if (_recorder == nil) {
        
        // 1.设置录音文件存放的url,音频相关参数
        // 1.1 要保存的路径(沙盒路径)
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        // 1.2 拼接全路径, caf是录音文件的格式,如mp3
        NSString *fullPath = [path stringByAppendingPathComponent:@"123.caf"];
        
        // 1.3 创建url
        NSURL *url = [NSURL fileURLWithPath:fullPath];
        
        // 1.4 设置setting
        /**
         AVEncoderAudioQualityKey : @(AVAudioQualityLow),   // 音频质量
         AVEncoderBitRateKey : @(16),                       // 比特率
         AVNumberOfChannelsKey : @(2),                      // 通道
         AVFormatIDKey : @(kAudioFormatLinearPCM),          // 音频编码
         AVSampleRateKey : @(8000.0)                        // 速率
         */
        NSDictionary *settingDict = @{
                                      AVEncoderAudioQualityKey : @(AVAudioQualityLow),
                                      AVEncoderBitRateKey : @(16),
                                      AVNumberOfChannelsKey : @(2),
                                      AVFormatIDKey : @(kAudioFormatLinearPCM),
                                      AVSampleRateKey : @(8000.0)
                                      };
        
        // 2.创建录音对象
        _recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settingDict error:nil];
    }
    return _recorder;
}

- (IBAction)startRecorder {
    // SINGLE: 开始录音
    [self.recorder record];
}

- (IBAction)stopRecorder {
    // SINGLE: 停止录音
    [self.recorder stop];
}

3.使用SystemSoundID播放音效

使用SystemSoundID播放音效

  • 使用SystemSoundID(C语言AudioServicesPlaySystemSound函数)方式播放短音效
    • 1.创建SystemSoundID
    • 2.创建音效资源url,url类型为CFURLRef类型,使用(__bridge CF type)方式桥联,不需要手动释放
      使用(__bridge_retained CF type)方式桥联,需要手动释放,需要调用CFRelease(CFTypeRef cf)方法释放
    • 3.通过url生成SystemSoundID
    • 4.播放音效
      • 播放音效没有有震动效果
        AudioServicesPlaySystemSound(soundID);
      • 播放音效有震动效果,需用真机测试
        AudioServicesPlayAlertSound(soundID);
// REMARKS: 使用SystemSoundID(C语言AudioServicesPlaySystemSound函数)方式播放音效
- (void)AudioServicesPlaySound
{
    // 1.创建SystemSoundID
    SystemSoundID soundID = 0;
    
    // 2.创建音效资源url
    // SINGLE: 使用(__bridge CF type)方式桥联,不需要手动释放
    // 使用(__bridge_retained CF type)方式桥联,需要手动释放,需要调用CFRelease(CFTypeRef cf)方法释放
    CFURLRef url = (__bridge CFURLRef)[[NSBundle mainBundle] URLForResource:@"buyao.wav" withExtension:nil];
    
    // 3.通过url生成SystemSoundID
    AudioServicesCreateSystemSoundID(url, &soundID);
    
    // 4.播放音效
    AudioServicesPlaySystemSound(soundID);  // 播放音效没有有震动效果
//    AudioServicesPlayAlertSound(soundID);   // 播放音效有震动效果,需用真机测试
}

封装使用SystemSoundID播放音效工具类

  • 封装播放音效WXAudioTool工具类
// SINGLE: 创建一个可变字典缓存歌曲,字典只需创建一次,可以在initialize类方法中创建
static NSMutableDictionary *_soundIDs;
+ (void)initialize {
    // 创建可变字典
    _soundIDs = [NSMutableDictionary dictionary];
}

// REMARKS: 播放音效类方法
/** 播放音效 */
+ (void)playSoundWithSoundName:(NSString *)soundName
{
    // 1.先从内存缓存获取soundID
    SystemSoundID soundID = [_soundIDs[soundName] unsignedIntegerValue];
    
    // 2.判断内存是否存在音效资源,内存没有音效资源,则创建
    if (soundID == 0) {
        // 2.1 若不存在, 创建音效资源url
        CFURLRef url = (__bridge CFURLRef)[[NSBundle mainBundle] URLForResource:soundName withExtension:nil];
        
        // 2.2 判断url是否为空,如果为空,说明资源不存在,直接退出
        if (url == nil) return;
        
        // 2.3 生成SystemSoundID
        AudioServicesCreateSystemSoundID(url, &soundID);
        
        // 2.4 存入可变字典内存缓存
        [_soundIDs setObject:@(soundID) forKey:soundName];
    }
    
    // 3.播放音效
    AudioServicesPlaySystemSound(soundID);
}

4.使用AVAudioPlayer播放器播放音乐

  • AVAudioPlayer控制音量属性,音量范围0.0 ~ 1.0
    self.player.volume = 0.5;
  • 使用AVAudioPlayer封装播放音乐工具类WXAudioTool
    • 实现播放/暂停/停止音乐等方法
      播放音乐: + (AVAudioPlayer *)playMusicWithMusicName:(NSString *)musicName;
      暂停音乐: + (void)pauseMusicWithMusicName:(NSString *)musicName;
      停止音乐: + (void)stopMusicWithMusicName:(NSString *)musicName;
      播放音效: + (void)playSoundWithSoundName:(NSString *)soundName;
#import "WXAudioTool.h"
#import 

@implementation WXAudioTool

// SINGLE: 创建一个可变字典缓存音乐,字典只需创建一次,可以在initialize类方法中创建
static NSMutableDictionary *_soundIDs;
// SINGLE: 创建音乐内存缓存,在initialize类方法中创建
static NSMutableDictionary *_players;

#pragma mark - 初始化设置
/** 创建内存缓存 */
+ (void)initialize {
    // 创建可变字典,用于存放播放音效SystemSoundID
    _soundIDs = [NSMutableDictionary dictionary];
    
    // 创建可变字典,用于存放音乐播放器AVAudioPlayer
    _players = [NSMutableDictionary dictionary];
}

#pragma mark - 播放音乐API(AVAudioPlayer)
/** 播放音乐 */
+ (AVAudioPlayer *)playMusicWithMusicName:(NSString *)musicName
{
    // 1.先从内存字典中获取播放器AVAudioPlayer
    AVAudioPlayer *player = _players[musicName];
    
    // 2.判断是否从内存获取到播放器,如果没有获取到,新建播放器
    if (player == nil) {
        // 2.1 获取音乐文件的url
        NSURL *url = [[NSBundle mainBundle] URLForResource:musicName withExtension:nil];
        if (url == nil) return nil;

        // 2.2 根据音频文件的url,创建播放器
        player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
        
        // 2.3 保存到内存缓存_players
        [_players setObject:player forKey:musicName];
    }
    
    // SINGLE: 3.播放音乐
    [player play];
    
    return player;
}

/** 暂停音乐 */
+ (void)pauseMusicWithMusicName:(NSString *)musicName
{
    // 1.从内存字典中取出播放器
    AVAudioPlayer *player = _players[musicName];
    
    // 2.如果内存中有获取到播放器,暂停播放
    if (player) {
        // SINGLE: 暂停播放
        [player pause];
    }
}

/** 停止音乐 */
+ (void)stopMusicWithMusicName:(NSString *)musicName
{
    // 1.从内存字典中取出播放器
    AVAudioPlayer *player = _players[musicName];
    
    // 2.如果内存中有获取到播放器,停止播放
    if (player) {
        // SINGLE: 2.1 停止播放
        [player stop];
        // 2.2 从内存字典中移除
        [_players removeObjectForKey:musicName];
        player = nil;
    }
}

#pragma mark - 播放短音效API(SystemSoundID)

// REMARKS: 播放音效类方法
/** 播放音效 */
+ (void)playSoundWithSoundName:(NSString *)soundName
{
    // 1.先从内存缓存获取soundID
    SystemSoundID soundID = [_soundIDs[soundName] unsignedIntValue];
    
    // 2.判断内存是否存在音效资源,内存没有音效资源,则创建
    if (soundID == 0) {
        // 2.1 若不存在, 创建音效资源url
        CFURLRef url = (__bridge CFURLRef)[[NSBundle mainBundle] URLForResource:soundName withExtension:nil];
        
        // 2.2 判断url是否为空,如果为空,说明资源不存在,直接退出
        if (url == nil) return;
        
        // 2.3 生成SystemSoundID
        AudioServicesCreateSystemSoundID(url, &soundID);
        
        // 2.4 存入可变字典内存缓存
        [_soundIDs setObject:@(soundID) forKey:soundName];
    }
    
    // 3.播放音效
    AudioServicesPlaySystemSound(soundID);
}
@end

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