iOS 錄音與播放

實(shí)現(xiàn)思路

利用系統(tǒng)框架AVFoundation實(shí)現(xiàn)錄音和錄音播放

注意事項(xiàng)

在Info.plist文件中添加如下代碼:
Privacy - Microphone Usage Description

754EFE5A-2AC9-4AAA-B083-F3A4DC3B53A0.png

核心代碼

1.添加框架
import AVFoundation

2.初始化錄音器和播放器

    //錄音器
    var audioRecorder:AVAudioRecorder!
    //播放器
    var audioPlayer:AVAudioPlayer!
    //獲取音頻會(huì)話單例
    let audioSession = AVAudioSession.sharedInstance()
    var filePath : String?
    
    /**
     定義音頻的編碼參數(shù)
     AVSampleRateKey:聲音采樣率 8000/11025/22050/44100/96000(影響音頻的質(zhì)量)
     AVFormatIDKey:編碼格式
     AVLinearPCMBitDepthKey:采樣位數(shù)  8、16、24、32 默認(rèn)為16
     AVNumberOfChannelsKey:音頻通道數(shù) 1 或 2
     AVEncoderAudioQualityKey:音頻質(zhì)量
     */
    let recordSettings = [AVSampleRateKey:NSNumber.init(value: 44100.0),AVFormatIDKey:NSNumber.init(value:kAudioFormatLinearPCM),AVLinearPCMBitDepthKey:NSNumber.init(value: 16),AVNumberOfChannelsKey:NSNumber.init(value: 1),AVEncoderAudioQualityKey:NSNumber.init(value:AVAudioQuality.high.rawValue)]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "錄音"
        initRecorder()
    }
    
    func initRecorder() {
        
        do {
            try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
            //MARK:加這段代碼解決聲音很小的問(wèn)題
            try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
            try audioRecorder = AVAudioRecorder(url: self.directoryUrl()! as URL, settings: recordSettings)
            audioRecorder.isMeteringEnabled = true
            audioRecorder.prepareToRecord()
            audioRecorder.delegate = self
        } catch let error as NSError {
            print(error)
        }
    }

    func directoryUrl () -> NSURL? {
         let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last
         filePath = (path)! + "/Record.wav"
         let fileUrl = NSURL.init(fileURLWithPath: filePath!)
         return fileUrl
      }

3.開(kāi)始錄制

@IBAction func beginRecorder(_ sender: Any) {
        //如果正在播放,則停止播放
        if let audio = audioPlayer {
            if audio.isPlaying {
                audio.stop()
            }
        }
        
        if !audioRecorder.isRecording {
            do {
                try audioSession.setActive(true)
                audioRecorder.record()
            } catch let error as NSError {
                print(error)
            }
        }
    }

4.暫停錄制

@IBAction func pauseRecorder(_ sender: Any) {
        //暫停后,點(diǎn)擊開(kāi)始錄制則會(huì)繼續(xù)接下去錄制
        if audioRecorder.isRecording {
            audioRecorder.pause()
        }
    }

5.停止錄制

@IBAction func stopRecorder(_ sender: Any) {
        
        if audioRecorder.isRecording {
            audioRecorder.stop()
            do {
                try audioSession.setActive(false)
            } catch let error as NSError {
                print(error)
            }
        }
    }

6.開(kāi)始播放

@IBAction func startPlaying(_ sender: Any) {
        
        //計(jì)算錄制文件的大小
        let manager = FileManager.default
        if manager.fileExists(atPath: filePath!) {
            do {
               let attr = try manager.attributesOfItem(atPath: filePath!)
                let size = attr[FileAttributeKey.size] as! Float
                print("文件大小為 \(size/1024.0)Kb")
            } catch let error as NSError {
                print(error)
            }
        }
        
        audioRecorder.stop()
        
        do {
            print(audioRecorder.url)
            let url:URL? = audioRecorder.url
            if let url = url {
                try audioPlayer = AVAudioPlayer.init(contentsOf: url)
                audioPlayer.delegate = self
                audioPlayer.play()
            }
        } catch let error as NSError {
            print(error)
        }
    }

7.暫停播放

@IBAction func pausePlaying(_ sender: Any) {
        
        if let player = audioPlayer {
            if player.isPlaying {
                if !audioRecorder.isRecording {
                    player.pause()
                }
            }
        }
    }

8.錄音器和播放器的兩個(gè)代理方法

extension ViewController : AVAudioRecorderDelegate {
    
    func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
        if flag {
            print("錄制完成")
            
        }
    }
}

extension ViewController : AVAudioPlayerDelegate {
    
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        if flag {
            print("播放完成")
        }
    }
    
}

把所有代碼整合一起就是一個(gè)Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容