我有一个如下设置,在带有iOS 10.3的iPhone 5s上进行测试,无论是进出调试 .
-
An
AVAudioRecorder
firesrecord(forDuration: 5.0)
-
A
CADisplayLink
监视录像机的水平(录像机是meteringEnabled
),同步动画,并跟踪recorder.currentTime
(但问题可以通过最低限度地跟踪显示链接中的时间来再现) -
recorder.currentTime
的报告始终达到> 5(通常为5.2到5.5)的值 . 结果与recorder.deviceTime
和CFAbsoluteTimeGetCurrent
的值基本一致 -
我初始化
AVAudioPlayer
并验证声音资产的持续时间恰好为5.0秒 .
根据我的理解,录音机的 currentTime
以秒为单位进行测量,当录音机恢复为假时会重置为0.0,这会在录音机停止时立即发生(这与我在 audioRecorderDidFinishRecording
中看到的一致)...所以观察 CADisplayLink
应该产生严格小于5.0的currentTime值?
问题是:这里可能出现什么问题?录音机正好在5秒后停止,但在内部它认为录音时间超过5秒?我正在听我的所有录音,听起来不错 .
我'm not sure if it'是相关的,但我的 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,但问题是未明确的,答案无益(至少对我来说) .
起初我想也许问题是重载主队列,所以不知何故 Logger 's sense of time becomes bloated (which I think would still constitute bad behavior), but after disabling the animation (and also experimenting with a Timer instead of a CADisplayLink), the problem persists!!! Perhaps it is still a threading problem, but I don't看到为什么会是这种情况 . 如果我确实需要多线程,我可以使用一些帮助理解和实施:)任何想法赞赏 .
1 回答
在我使用
AVAudioRecorder
的所有时间里,我最终不得不更换它 .AVAudioRecorder
是一个通用的录音课程,所以一旦你的要求变得有点专业化,它就会让你失望 .然而,它确实做了计量,这吸引了很多人 . 所以也许情况可以得到挽救 .
可能性:
一个 . 如果
currentTime
不是't trustworthy, then don' t观察它!你有5秒钟的文件,所以也许可以找到一些其他方法来标记你的应用程序中的那段时间 .湾属性
currentTime
,头文件说:您是否只在录制时对_1002671进行采样?如果是这样可能是问题 . 在这种情况下,您可以使用
deviceCurrentTime
属性,该属性始终有效,但您必须减去初始deviceCurrentTime
.如果情况无法挽救,你可以很快用
AVAudioEngine
和AVAudioFile
替换AVAudioRecorder
,但这是另一天的问题 .