ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

IOS15 Swift5 实现录音App

2022-01-25 13:04:07  阅读:191  来源: 互联网

标签:IOS15 App print 录音 fileName var let func Swift5


//
//  ViewController.swift
//  AudioRecoardDemo
//
//  Created by lujun on 2022/1/25.
//

import UIKit
import AudioToolbox
import AVFoundation
class ViewController: UIViewController, AVAudioPlayerDelegate {
    /// 播放音频
    var player: AVAudioPlayer!
    /// 录音
    var recorder: AVAudioRecorder!
    /// 用户输入的文件名
    var recordFileName = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        myLabel.text = "录音测试"
        debugPrint(NSHomeDirectory())
    }
    // push到下一级页面的时候结束
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if player != nil {
            player.stop()
            player = nil
        }
        startButton.isEnabled = true
    }
    @IBOutlet weak var startButton: UIButton!
    @IBOutlet weak var myLabel: UILabel!
   

    @IBAction func addSound(_ sender: UIButton) {
        sender.isSelected = !sender.isSelected
        if sender.isSelected {
            sender.setTitle("结束并保存", for: .selected)
            let alertController = UIAlertController(title: "文件名", message: "请输入录音文件名", preferredStyle: .alert)
            let ensureAction = UIAlertAction(title: "确定", style: .default) { (action) in
                let textField = alertController.textFields![0] as UITextField
                self.recordFileName =  textField.text!
                // 开始录音
                self.createRecord()
            }
            let cancelAction = UIAlertAction(title: "取消", style: .default, handler: nil)
            alertController.addAction(ensureAction)
            alertController.addAction(cancelAction)
            alertController.addTextField { (textField) in
                textField.placeholder = "请输入录音文件名"
            }
            present(alertController, animated: true, completion: nil)
        }
        else {
            saveRecord()
        }
    }
    @IBAction func startTest(_ sender: UIButton) {
        sender.isEnabled = false
        avPlaySound()
    }
    
}


// MARK: - AudioServices 播放模式
extension ViewController {
    func playSound() {
        // 0,手机的静音开关打开后,听不到声音
        let audioFilePath = Bundle.main.path(forResource: fileName(), ofType: nil)
        let url = URL(fileURLWithPath: audioFilePath!)
        // 1.获取系统声音ID
        var soundID: SystemSoundID = 0
        AudioServicesCreateSystemSoundID(url as CFURL, &soundID)
        // 2.播放音频
        AudioServicesPlaySystemSound(soundID)
        AudioServicesPlaySystemSoundWithCompletion(soundID) {
            print("AudioServices - 播放结束---")
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5, execute: {
                print("AudioServices - 播放开始---")
                self.playSound()
            })
        }
    }
}

// MARK: - AVFoundation 播放模式
extension ViewController {
    func avPlaySound()  {
        let audioFilePath = Bundle.main.path(forResource: fileName(), ofType: nil)
        let url = URL(fileURLWithPath: audioFilePath!)
        player = try? AVAudioPlayer(contentsOf: url)
        guard let p = player else {
            return
        }
        p.delegate = self
        p.play()
    }
    
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        print("AVAudioPlayer - 播放结束---")
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5) {
            print("AVAudioPlayer - 播放开始---")
            guard self.player != nil  else{
                return
            }
            self.avPlaySound()
        }
    }
}
// MARK: - 获取文件的名字
extension ViewController {
    
    func fileName() -> String {
        let number = arc4random_uniform(60)
        var fileName = ""
        switch number {
        case 0...9:
            fileName = "diSound.wav"
        case 10...19:
            fileName = "diSound.wav"
        case 20...29:
            fileName = "diSound.wav"
        case 30...39:
            fileName = "diSound.wav"
        case 40...49:
            fileName = "diSound.wav"
        case 50...59:
            fileName = "diSound.wav"
        default:
            fileName = "diSound.wav"
        }
        return fileName
    }
    
}
extension ViewController {
    fileprivate func createRecord() {
        var files =  LRSoundSourceManger.obtainFileName()
        // 第一次取得时候应该是空的
        if files == nil {
            print("新建文件")
            files = [String]()
        }
        let document = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString;
        let fileName = recordFileName.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        let path = document.appendingPathComponent("\(fileName!).caf")
        let url = URL(string: path)
        
        // 录音格式
        var recordSettings = [String : Any]()
        // 编码格式
        recordSettings[AVFormatIDKey] = kAudioFormatLinearPCM
        // 采样率
        recordSettings[AVSampleRateKey] = 8000.0
        // 通道数
        recordSettings[AVNumberOfChannelsKey] = 1
        // 采样的位数
        recordSettings[AVLinearPCMBitDepthKey] = 16
        // 音频质量,采样质量
        // 这个设置完成后就会:prepareToRecord:准备失败;record:开始录音失败
        recorder = try! AVAudioRecorder(url: url!, settings: recordSettings)
        recorder.isMeteringEnabled = true
        // 这个设置不加的话,record方法返回false
        try! AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.record)
        if recorder.prepareToRecord() {
            print("准备录音。。。")
            if self.recorder.record() {
                print("开始录音。。。")
            }
        }
    }
    // 保存录音文件
    fileprivate func saveRecord() {
        print("录音结束。。。")
        LRSoundSourceManger.saveFileName(recordFileName)
        self.recorder.stop()
    }
}

标签:IOS15,App,print,录音,fileName,var,let,func,Swift5
来源: https://www.cnblogs.com/Johnson-Swift/p/15842519.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有