AVFoundation-音效播放

    音效和音乐? 其实并没有严格意义上的限定,一般在开发中,将时间比较短, 播放频率比较高的, 当做音效处理;

SystemSoundID播放本地音效步骤

  1. 导入AVFoundation框架(其实音效处理对应的框架是AudioToolbox, 只不过AVFoundation框架包含了此框架)
    // OC
    #import

     // swift
     import AVFoundation
    
  2. 使用对应的API, 开始播放音效

    • objc
    // 1. 根据音效文件, 来生成SystemSoundID
    
        // 1.1 获取URL
        CFURLRef urlRef = (__bridge CFURLRef)([[NSBundle mainBundle] URLForResource:@"m_16.wav" withExtension:nil]);
    
        // 1.2 创建保存soundID 的变量
        SystemSoundID soundID;
    
        // 1.3 通过url, 和soundID的地址, 接收对应的音效soundID
        AudioServicesCreateSystemSoundID(urlRef, &soundID);
    
    // 2. 播放音效
        // 2.1 不带振动效果
        // AudioServicesPlaySystemSound(soundID);
    
        // 2.2 带振动效果
        // AudioServicesPlayAlertSound(soundID);
    
        // 2.3 不带振动效果,播放完成后, 回调代码块
        AudioServicesPlaySystemSoundWithCompletion(soundID1, ^{
            AudioServicesPlaySystemSound(soundID2);
        });
    
        // 2.4 带振动效果,播放完成后, 回调代码块
        // AudioServicesPlayAlertSoundWithCompletion(soundID1), ^{
            // AudioServicesPlayAlertSound(soundID);
        // });
    
    // 3. 根据SoundID释放内存
        AudioServicesDisposeSystemSoundID(soundID);
    
    1. swift
    class func playSound(audioName: String, isAlert: Bool , playFinish: (()->())?) {
    
        // 一. 获取 SystemSoundID
        //   参数1: 文件路径
        //   参数2: SystemSoundID, 指针
        guard let url = NSBundle.mainBundle().URLForResource(audioName, withExtension: nil) else {
            print("没有找到音频路径")
            return
        }
        let urlCF = url as CFURLRef
    
        var systemSoundID: SystemSoundID = 0
        AudioServicesCreateSystemSoundID(urlCF, &systemSoundID)
    
        // 二. 开始播放
        // 判断是否振动
        if isAlert {
            // 1. 带振动播放, 可以监听播放完成(模拟器不行)
            AudioServicesPlayAlertSoundWithCompletion(systemSoundID)
            {
                print("播放完成")
                // 三. 释放资源
                AudioServicesDisposeSystemSoundID(systemSoundID)
    
                // 四. 执行回调
                if playFinish != nil { playFinish!()}
            }
        }else {
            // 2. 不带振动播放, 可以监听播放完成
            AudioServicesPlaySystemSoundWithCompletion(systemSoundID) {
    
                print("播放完成")
                // 三. 释放资源
                AudioServicesDisposeSystemSoundID(systemSoundID)
    
                // 四. 执行回调
                if playFinish != nil { playFinish!()}
            }
        }
    }
    
  3. 代码优化, 播放工具类的封装;

     1. 优化soundID的生成, 不需要每次都创建一遍
    
     2. 封装播放逻辑, 供多处调用
    
  4. 音效播放其他使用

  5. 音效播放详解

你可能感兴趣的:(AVFoundation-音效播放)