美文网首页swiftSwfit学习
Swift - 制作一个录音机(声音的录制与播放)

Swift - 制作一个录音机(声音的录制与播放)

作者: 小驴拉磨 | 来源:发表于2020-07-21 16:29 被阅读0次

    1、技术介绍

    (1)AVFoundation.framework 框架提供了 AVAudioRecorder 类。它可以实现录音功能。
    (2)而使用该框架的 AVAudioPlayer 类,可以实现声音的播放。

    2、下面制作一个录音机样例

    (1)按住录音按钮则开始录音,松开则停止录音。录音文件保存在用户文件夹下。
    (2)录音过程中会实时显示声音的音量大小(这个可以用来做声音脉冲图,获得更好的展示效果)
    (3)点击播放录音则可播放录制的声音文件。

    3、效果图如下:

    image.png

    4、Info.plist配置

    由于苹果安全策略更新,需要在 Info.plist 配置请求麦克风相的关描述字段(Privacy - Microphone Usage Description)


    image.png

    5、代码如下:

    import UIKit
    import AVFoundation
     
    class ViewController: UIViewController {
         
        var recorder:AVAudioRecorder? //录音器
        var player:AVAudioPlayer? //播放器
        var recorderSeetingsDic:[String : Any]? //录音器设置参数数组
        var volumeTimer:Timer! //定时器线程,循环监测录音的音量大小
        var aacPath:String? //录音存储路径
         
        @IBOutlet weak var volumLab: UILabel! //显示录音音量
         
        override func viewDidLoad() {
            super.viewDidLoad()
             
            //初始化录音器
            let session:AVAudioSession = AVAudioSession.sharedInstance()
             
            //设置录音类型
            try! session.setCategory(AVAudioSession.Category.playAndRecord)
            //设置支持后台
            try! session.setActive(true)
            //获取Document目录
            let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory,
                                                             .userDomainMask, true)[0]
            //组合录音文件路径
            aacPath = docDir + "/play.aac"
            //初始化字典并添加设置参数
            recorderSeetingsDic =
                [
                    AVFormatIDKey: NSNumber(value: kAudioFormatMPEG4AAC),
                    AVNumberOfChannelsKey: 2, //录音的声道数,立体声为双声道
                    AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue,
                    AVEncoderBitRateKey : 320000,
                    AVSampleRateKey : 44100.0 //录音器每秒采集的录音样本数
            ]
        }
         
        //按下录音
        @IBAction func downAction(_ sender: AnyObject) {
            //初始化录音器
            recorder = try! AVAudioRecorder(url: URL(string: aacPath!)!,
                                            settings: recorderSeetingsDic!)
            if recorder != nil {
                //开启仪表计数功能
                recorder!.isMeteringEnabled = true
                //准备录音
                recorder!.prepareToRecord()
                //开始录音
                recorder!.record()
                //启动定时器,定时更新录音音量
                volumeTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self,
                                    selector: #selector(ViewController.levelTimer),
                                    userInfo: nil, repeats: true)
            }
        }
         
        //松开按钮,结束录音
        @IBAction func upAction(_ sender: AnyObject) {
            //停止录音
            recorder?.stop()
            //录音器释放
            recorder = nil
            //暂停定时器
            volumeTimer.invalidate()
            volumeTimer = nil
            volumLab.text = "0"
        }
         
        //播放录制的声音
        @IBAction func playAction(_ sender: AnyObject) {
            //播放
            player = try! AVAudioPlayer(contentsOf: URL(string: aacPath!)!)
            if player == nil {
                print("播放失败")
            }else{
                player?.play()
            }
        }
         
        //定时检测录音音量
        @objc func levelTimer(){
            recorder!.updateMeters() // 刷新音量数据
            let averageV:Float = recorder!.averagePower(forChannel: 0) //获取音量的平均值
            let maxV:Float = recorder!.peakPower(forChannel: 0) //获取音量最大值
            let lowPassResult:Double = pow(Double(10), Double(0.05*maxV))
            volumLab.text = "\(lowPassResult)"
        }
         
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }
    

    原文出自:www.hangge.com

    相关文章

      网友评论

        本文标题:Swift - 制作一个录音机(声音的录制与播放)

        本文链接:https://www.haomeiwen.com/subject/gziikktx.html