调用 record() 时 AVAudioRecorder 长时间延迟

Posted

技术标签:

【中文标题】调用 record() 时 AVAudioRecorder 长时间延迟【英文标题】:AVAudioRecorder long delay when record() is called 【发布时间】:2018-08-20 16:34:54 【问题描述】:

我正在使用 AVAudioRecorder 在视频中录制音频。当我按下“开始”按钮开始录音时,会有很长的延迟,有时在录音开始前长达 6 秒。然后录制不成功,并出现在文件中,持续时间为 0.0 秒。

**** 已编辑帖子以尝试使问题更清晰

我创建了一个示例音频录制项目,我所做的只是尝试录制音频,但它仍然不适合我。我的代码如下:

import UIKit
import AVFoundation

class ViewController: UIViewController, AVAudioRecorderDelegate 

    var recordingSession: AVAudiosession!
    var audioRecorder: AVAudioRecorder!
    var settings = [String : Int]()
    var outputAudioLocation: URL!

    @IBOutlet weak var startButton: UIButton!
    @IBOutlet weak var stopButton: UIButton!

    override func viewDidLoad() 
        super.viewDidLoad()
        //setUpAudioSession()

        recordingSession = AVAudioSession.sharedInstance()
        do 
            try recordingSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
            try recordingSession.setActive(true)
            recordingSession.requestRecordPermission  (hasPermission) in
            if hasPermission 
                print("Accepted")
             else 
                print("Not allowed")
            
        
            print("audio set up")
         catch 
            print("Recording session error")
        
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


    @IBAction func startButtonPressed(_ sender: Any) 
        recordAudio()
    

    @IBAction func stopButtonPressed(_ sender: Any) 
        stopRecordingAudio()
    

    func recordAudio() 
        // Check if we have an active recorder
        if audioRecorder == nil 

            outputAudioLocation = getDirectory().appendingPathComponent("audio.m4a")

            settings = [AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
                        AVSampleRateKey: 44100,
                        AVNumberOfChannelsKey: 2,
                        AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
            ]

            // Start Audio Recording
            do 
                audioRecorder = try AVAudioRecorder(url: outputAudioLocation, settings: settings)
                audioRecorder.delegate = self
                audioRecorder.record()
                print("audio recording")
             catch 
                print("Audio recording hasn't worked")
            
        
    

    func stopRecordingAudio() 
        if audioRecorder != nil 
            audioRecorder.stop()
            print("audio stopped recording")
            audioRecorder = nil
        
    

    //directory for audio recording
    func getDirectory() -> URL 
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let documentDirectory = paths[0]
        return documentDirectory
    


    func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) 
        if !flag 
            print("audio recording successful")
         else 
            print("audio recording not successful")
        
    


**** 更新

我下载了一个使用 AVAudioRecorder 的 GitHub 项目,当我在我的 iPhone 6 手机上尝试它时,录音无法正常工作,并以 0.0 的持续时间保存。但是,当我使用模拟器(iPhone 8)时,它按预期工作。有谁知道为什么这可能会发生在我的手机上?在我自己的项目中,它一直运行良好,直到今天。

【问题讨论】:

我有另一个名为 DataCaptureViewController 的类,其中创建了 AudioRecorder() 的实例。我有一个 startButtonPressed 操作,这就是我调用 audioRecorder.recordAudio() 的地方。我对 Swift 还是很陌生。你认为它有可能在后台线程上吗? 看来音频甚至不再正确录制了。它以 0.0 的持续时间保存文件。这真的很奇怪,因为当我上次查看它时,所有这些代码都运行良好。也许我得看看设置。 【参考方案1】:

在我浪费了 5 个多小时的时间试图找出我的代码出了什么问题后,结果发现是我的 iPhone 出了问题。

我将手机关机再开机,现在正在录音。我从没想过这会是个问题。

感谢@matt 试图帮助我!

【讨论】:

酷!我的意思是你解决了它很酷。再加上这可能发生的事实对其他人来说是有用的,因此被赞成。

以上是关于调用 record() 时 AVAudioRecorder 长时间延迟的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 3 在 Magical Record 中保存上下文时出错

如何使用 recorder.js 对象调用此函数“.record()”?

RecognitionService:在没有RECORD_AUDIO权限的情况下调用识别服务;扩展识别服务

AVAudioRecorder 不保存录音

如何从 perf_event_open 中的环形缓冲区中检索调用链以获取 PERF_RECORD_SWITCH?

无法从PHP调用存储过程