一、創建項目
二、設置權限
需要設置麥克風權限
三、界面實現
界面很簡單,畢竟只是個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)")
}
}
}