一、创建项目
二、设置权限
需要设置麦克风权限
三、界面实现
界面很简单,毕竟只是个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)")
}
}
}