IOS Swift 5.0 錄音和播放

一、創建項目

 

二、設置權限

    需要設置麥克風權限

 

三、界面實現

    界面很簡單,畢竟只是個demo,界面上兩個按鈕,一個錄音(開始和結束),一個播放錄音

 

四、代碼實現

    實現下面的代碼可以實現簡單的錄音和播放錄音了

    注意:錄音和播放可以將 AVAudioSession 設置爲不同的模式,否則在聽筒模式播放錄音聲音會很小

    聽筒錄音模式:AVAudioSession.Category.playAndRecord

    播放外放模式:AVAudioSession.Category.playback

import UIKit
import AVFoundation

class VoiceController: UIViewController {
    
    var recorder: AVAudioRecorder?
    var player: AVAudioPlayer?

    //設置保存地址
    let file_path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first?.appending("/record.wav")
    
    //用於判斷當前是開始錄音還是完成錄音
    var type:Bool = true
    //界面上的一個按鈕-開始錄音和完成錄音,同一個按鈕
    @IBOutlet weak var control: UIButton!
    @IBAction func recording(_ sender: UIButton) {
        if type{
            beginRecord()
            type = false
            control.setTitle("完成", for: .normal)
        }else{
            stopRecord()
            type = true
            control.setTitle("錄音", for: .normal)
        }
    }

    //界面上的一個按鈕-播放錄音
    @IBAction func play(_ sender: UIButton) {
        play()
    }
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    
    //開始錄音
    var session:AVAudioSession = AVAudioSession.sharedInstance()
    func beginRecord() {
        //設置session類型
        do {
            try session.setCategory(AVAudioSession.Category.playAndRecord)
        } catch let err{
            print("設置類型失敗:\(err.localizedDescription)")
        }
        //設置session動作
        do {
            try session.setActive(true)
        } catch let err {
            print("初始化動作失敗:\(err.localizedDescription)")
        }
        //錄音設置,注意,後面需要轉換成NSNumber,如果不轉換,你會發現,無法錄製音頻文件,我猜測是因爲底層還是用OC寫的原因
        let recordSetting: [String: Any] = [AVSampleRateKey: NSNumber(value: 16000),//採樣率
                                            AVFormatIDKey: NSNumber(value:kAudioFormatLinearPCM),//音頻格式
                                            AVLinearPCMBitDepthKey: NSNumber(value: 16),//採樣位數
                                            AVNumberOfChannelsKey: NSNumber(value: 1),//通道數
                                            AVEncoderAudioQualityKey: NSNumber(value: AVAudioQuality.min.rawValue)//錄音質量

        ];
        //開始錄音
        do {
            let url = URL(fileURLWithPath: file_path!)
            recorder = try AVAudioRecorder(url: url, settings: recordSetting)
            recorder!.prepareToRecord()
            recorder!.record()
            print("開始錄音")
        } catch let err {
            print("錄音失敗:\(err.localizedDescription)")
        }
    }
    
    //結束錄音
    func stopRecord() {
        if let recorder = self.recorder {
            if recorder.isRecording {
                print("正在錄音,馬上結束它,文件保存到了:\(file_path!)")
            }else {
                print("沒有錄音,但是依然結束它")
            }
            recorder.stop()
            self.recorder = nil
        }else {
            print("沒有初始化")
        }
    }
    
    //播放
    func play() {
        //設置外放模式,不然錄音會用聽筒模式播放,就很小聲
        if session.category != AVAudioSession.Category.playback {
            do{
                try session.setCategory(AVAudioSession.Category.playback)
            } catch{
                print("外放模式設置失敗")
            }
        }
        do {
            player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: file_path!))
            print("歌曲長度:\(player!.duration)")
            player!.play()
        } catch let err {
            print("播放失敗:\(err.localizedDescription)")
        }
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章