實(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("播放完成")
}
}
}