调用 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权限的情况下调用识别服务;扩展识别服务