gpt4 book ai didi

audio - 在 Swift 中录制音频

转载 作者:IT王子 更新时间:2023-10-29 05:00:41 27 4
gpt4 key购买 nike

有谁知道我在哪里可以找到有关如何在 Swift 应用程序中录制音频的信息?我一直在查看一些音频播放示例,但我似乎无法找到任何关于实现录音的内容。谢谢

最佳答案

在 Swift 3 中

enter image description here

  • 添加框架 AVFoundation
  • **在info.plist中添加键值

Key = Privacy - Microphone Usage Description and Value = For using microphone

(如果您不提供该值,应用程序将崩溃 - 说明您请求权限的原因)**

enter image description here

  • 导入 AVFoundation & AVAudioRecorderDelegate, AVAudioPlayerDelegate

    import AVFoundation

    class RecordVC: UIViewController , AVAudioRecorderDelegate, AVAudioPlayerDelegate
  • 创建用于录制音频和播放音频的按钮,以及用于显示录制时间的标签,并为 start_recording 和 play_recording 提供导出和 Action ,并声明一些我们稍后将使用的变量

    @IBOutlet var recordingTimeLabel: UILabel!
    @IBOutlet var record_btn_ref: UIButton!
    @IBOutlet var play_btn_ref: UIButton!

    var audioRecorder: AVAudioRecorder!
    var audioPlayer : AVAudioPlayer!
    var meterTimer:Timer!
    var isAudioRecordingGranted: Bool!
    var isRecording = false
    var isPlaying = false
  • 在viewDidLoad中查看记录权限

    override func viewDidLoad() {
    super.viewDidLoad()
    check_record_permission()
    }

    func check_record_permission()
    {
    switch AVAudioSession.sharedInstance().recordPermission() {
    case AVAudioSessionRecordPermission.granted:
    isAudioRecordingGranted = true
    break
    case AVAudioSessionRecordPermission.denied:
    isAudioRecordingGranted = false
    break
    case AVAudioSessionRecordPermission.undetermined:
    AVAudioSession.sharedInstance().requestRecordPermission({ (allowed) in
    if allowed {
    self.isAudioRecordingGranted = true
    } else {
    self.isAudioRecordingGranted = false
    }
    })
    break
    default:
    break
    }
    }
  • 生成要将该录音保存为 myRecording.m4a 的路径

    func getDocumentsDirectory() -> URL
    {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory
    }

    func getFileUrl() -> URL
    {
    let filename = "myRecording.m4a"
    let filePath = getDocumentsDirectory().appendingPathComponent(filename)
    return filePath
    }
  • 设置记录器

    func setup_recorder()
    {
    if isAudioRecordingGranted
    {
    let session = AVAudioSession.sharedInstance()
    do
    {
    try session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker)
    try session.setActive(true)
    let settings = [
    AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
    AVSampleRateKey: 44100,
    AVNumberOfChannelsKey: 2,
    AVEncoderAudioQualityKey:AVAudioQuality.high.rawValue
    ]
    audioRecorder = try AVAudioRecorder(url: getFileUrl(), settings: settings)
    audioRecorder.delegate = self
    audioRecorder.isMeteringEnabled = true
    audioRecorder.prepareToRecord()
    }
    catch let error {
    display_alert(msg_title: "Error", msg_desc: error.localizedDescription, action_title: "OK")
    }
    }
    else
    {
    display_alert(msg_title: "Error", msg_desc: "Don't have access to use your microphone.", action_title: "OK")
    }
    }
  • 按下 start_recording 按钮开始录音并使用 updateAudioMeter 显示秒数,如果开始录音则结束录音

    @IBAction func start_recording(_ sender: UIButton)
    {
    if(isRecording)
    {
    finishAudioRecording(success: true)
    record_btn_ref.setTitle("Record", for: .normal)
    play_btn_ref.isEnabled = true
    isRecording = false
    }
    else
    {
    setup_recorder()

    audioRecorder.record()
    meterTimer = Timer.scheduledTimer(timeInterval: 0.1, target:self, selector:#selector(self.updateAudioMeter(timer:)), userInfo:nil, repeats:true)
    record_btn_ref.setTitle("Stop", for: .normal)
    play_btn_ref.isEnabled = false
    isRecording = true
    }
    }

    func updateAudioMeter(timer: Timer)
    {
    if audioRecorder.isRecording
    {
    let hr = Int((audioRecorder.currentTime / 60) / 60)
    let min = Int(audioRecorder.currentTime / 60)
    let sec = Int(audioRecorder.currentTime.truncatingRemainder(dividingBy: 60))
    let totalTimeString = String(format: "%02d:%02d:%02d", hr, min, sec)
    recordingTimeLabel.text = totalTimeString
    audioRecorder.updateMeters()
    }
    }

    func finishAudioRecording(success: Bool)
    {
    if success
    {
    audioRecorder.stop()
    audioRecorder = nil
    meterTimer.invalidate()
    print("recorded successfully.")
    }
    else
    {
    display_alert(msg_title: "Error", msg_desc: "Recording failed.", action_title: "OK")
    }
    }
  • 播放录音

    func prepare_play()
    {
    do
    {
    audioPlayer = try AVAudioPlayer(contentsOf: getFileUrl())
    audioPlayer.delegate = self
    audioPlayer.prepareToPlay()
    }
    catch{
    print("Error")
    }
    }

    @IBAction func play_recording(_ sender: Any)
    {
    if(isPlaying)
    {
    audioPlayer.stop()
    record_btn_ref.isEnabled = true
    play_btn_ref.setTitle("Play", for: .normal)
    isPlaying = false
    }
    else
    {
    if FileManager.default.fileExists(atPath: getFileUrl().path)
    {
    record_btn_ref.isEnabled = false
    play_btn_ref.setTitle("pause", for: .normal)
    prepare_play()
    audioPlayer.play()
    isPlaying = true
    }
    else
    {
    display_alert(msg_title: "Error", msg_desc: "Audio file is missing.", action_title: "OK")
    }
    }
    }
  • 录制完成后启用播放按钮 & 播放完成后启用录制按钮

    func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool)
    {
    if !flag
    {
    finishAudioRecording(success: false)
    }
    play_btn_ref.isEnabled = true
    }

    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)
    {
    record_btn_ref.isEnabled = true
    }
  • 显示警报的泛化函数

    func display_alert(msg_title : String , msg_desc : String ,action_title : String)
    {
    let ac = UIAlertController(title: msg_title, message: msg_desc, preferredStyle: .alert)
    ac.addAction(UIAlertAction(title: action_title, style: .default)
    {
    (result : UIAlertAction) -> Void in
    _ = self.navigationController?.popViewController(animated: true)
    })
    present(ac, animated: true)
    }

关于audio - 在 Swift 中录制音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26472747/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com