我有一个设置如下,在iOS5.3s上测试iPhone5s,无论是否进行调试。AVAudioRecorder currentTime给出了错误的值
- 一种
AVAudioRecorder
火灾record(forDuration: 5.0)
- 甲
CADisplayLink
手表记录器的水平(记录器是meteringEnabled
),同步的动画,和跟踪的recorder.currentTime
(但问题可以通过最低限度地保持的时间轨道被再现在显示链接中) recorder.currentTime
的报告始终达到> 5的值(通常为5.2-5.5)。结果与recorder.deviceTime
和CFAbsoluteTimeGetCurrent
- 的值基本一致初始化
AVAudioPlayer
并验证声音资产确实具有精确5.0秒的持续时间。
从我的理解,录音机的currentTime
在几秒钟内进行测量,并重置为0.0时recorder.isRecording恢复到假,记录停止时会立即发生(这是我所看到的在audioRecorderDidFinishRecording
一致).. 。因此,使用CADisplayLink
观察时应该产生严格小于5.0的currentTime值?
问题是:这里可能会出现什么问题?记录仪正好在5秒后停止,但在内部它认为记录时间超过5秒?我正在听我的所有录音,他们听起来很好。
我不知道,如果是相关的,但我的AVAudioSession
是AVAudioSessionCategoryPlayAndRecord
型的,和我的音频设置如下(所有这些除外采样率是必要的供日后分析):
audioSettings = [
AVFormatIDKey: Int(kAudioFormatLinearPCM),
AVSampleRateKey: 44100,
AVNumberOfChannelsKey: 2,
AVLinearPCMIsBigEndianKey: 0,
AVLinearPCMIsFloatKey: 0,
AVLinearPCMBitDepthKey: 16,
AVLinearPCMIsNonInterleaved: 0
]
我已经试过摆弄所有这些,并没有看到任何改变行为。
的CADisplayLink
从主线程通过
recorderDisplayLink?.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
唯一类似的问题,我可以找到关于堆栈交换this,但问题是尚未得以确认,答案无益增加(至少对我来说)。
起初我想也许问题是重载主队列,以至于记录器的时间感变得臃肿(我认为 仍然会构成不良行为),但是在禁用动画之后(并且还尝试使用Timer而不是CADisplayLink),问题依然存在!也许它仍然是一个线程问题,但我不明白为什么会这样。如果我需要多线程,我可以使用一些帮助理解和实施:) 任何想法赞赏。
所以问题是为什么你要比'recordForDuration:'要求的持续时间多0.2秒到0.5秒? –
问题是,以下两条语句如何同时兼容: (1)记录(forDuration:5.0)产生的确切记录时间为5.0秒 (2)计时器观察记录仪的currentTime属性, > 5.0 –
TL; DR'AVAudioRecorder'不太好,请替换它。看到我的答案为更细致的版本。 –