

import UIKit
import AudioToolbox
import AVFoundation
class ViewController: UIViewController, AVAudioPlayerDelegate {
var player: AVAudioPlayer!
var recorder: AVAudioRecorder!
var recordFileName = ""
override func viewDidLoad() {
super.viewDidLoad()
myLabel.text = "录音测试"
debugPrint(NSHomeDirectory())
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if player != nil {
player.stop()
player = nil
}
startButton.isEnabled = true
}
@IBOutlet weak var startButton: UIButton!
@IBOutlet weak var myLabel: UILabel!
@IBAction func addSound(_ sender: UIButton) {
sender.isSelected = !sender.isSelected
if sender.isSelected {
sender.setTitle("结束并保存", for: .selected)
let alertController = UIAlertController(title: "文件名", message: "请输入录音文件名", preferredStyle: .alert)
let ensureAction = UIAlertAction(title: "确定", style: .default) { (action) in
let textField = alertController.textFields![0] as UITextField
self.recordFileName = textField.text!
self.createRecord()
}
let cancelAction = UIAlertAction(title: "取消", style: .default, handler: nil)
alertController.addAction(ensureAction)
alertController.addAction(cancelAction)
alertController.addTextField { (textField) in
textField.placeholder = "请输入录音文件名"
}
present(alertController, animated: true, completion: nil)
}
else {
saveRecord()
}
}
@IBAction func startTest(_ sender: UIButton) {
sender.isEnabled = false
avPlaySound()
}
}
extension ViewController {
func playSound() {
let audioFilePath = Bundle.main.path(forResource: fileName(), ofType: nil)
let url = URL(fileURLWithPath: audioFilePath!)
var soundID: SystemSoundID = 0
AudioServicesCreateSystemSoundID(url as CFURL, &soundID)
AudioServicesPlaySystemSound(soundID)
AudioServicesPlaySystemSoundWithCompletion(soundID) {
print("AudioServices - 播放结束---")
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5, execute: {
print("AudioServices - 播放开始---")
self.playSound()
})
}
}
}
extension ViewController {
func avPlaySound() {
let audioFilePath = Bundle.main.path(forResource: fileName(), ofType: nil)
let url = URL(fileURLWithPath: audioFilePath!)
player = try? AVAudioPlayer(contentsOf: url)
guard let p = player else {
return
}
p.delegate = self
p.play()
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
print("AVAudioPlayer - 播放结束---")
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5) {
print("AVAudioPlayer - 播放开始---")
guard self.player != nil else{
return
}
self.avPlaySound()
}
}
}
extension ViewController {
func fileName() -> String {
let number = arc4random_uniform(60)
var fileName = ""
switch number {
case 0...9:
fileName = "diSound.wav"
case 10...19:
fileName = "diSound.wav"
case 20...29:
fileName = "diSound.wav"
case 30...39:
fileName = "diSound.wav"
case 40...49:
fileName = "diSound.wav"
case 50...59:
fileName = "diSound.wav"
default:
fileName = "diSound.wav"
}
return fileName
}
}
extension ViewController {
fileprivate func createRecord() {
var files = LRSoundSourceManger.obtainFileName()
if files == nil {
print("新建文件")
files = [String]()
}
let document = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString;
let fileName = recordFileName.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
let path = document.appendingPathComponent("\(fileName!).caf")
let url = URL(string: path)
var recordSettings = [String : Any]()
recordSettings[AVFormatIDKey] = kAudioFormatLinearPCM
recordSettings[AVSampleRateKey] = 8000.0
recordSettings[AVNumberOfChannelsKey] = 1
recordSettings[AVLinearPCMBitDepthKey] = 16
recorder = try! AVAudioRecorder(url: url!, settings: recordSettings)
recorder.isMeteringEnabled = true
try! AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.record)
if recorder.prepareToRecord() {
print("准备录音。。。")
if self.recorder.record() {
print("开始录音。。。")
}
}
}
fileprivate func saveRecord() {
print("录音结束。。。")
LRSoundSourceManger.saveFileName(recordFileName)
self.recorder.stop()
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库