我有一个如下设置,在带有iOS 10.3的iPhone 5s上进行测试,无论是进出调试。
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,这会在录音机停止时立即发生(这与我在{{1 }})...所以用audioRecorderDidFinishRecording
观察应该产生严格小于5.0的currentTime值?
问题是:这里可能出现什么问题?录音机正好在5秒后停止,但在内部它认为它录制时间超过5秒?我正在听我的所有录音,听起来不错。
我不确定它是否相关,但我的CADisplayLink
类型为AVAudioSession
,我的音频设置如下(所有这些除了采样率都是以后分析所必需的):< / p>
AVAudioSessionCategoryPlayAndRecord
我已经尝试过摆弄所有这些并且没有看到任何改变行为。
通过
从主线程添加audioSettings = [
AVFormatIDKey: Int(kAudioFormatLinearPCM),
AVSampleRateKey: 44100,
AVNumberOfChannelsKey: 2,
AVLinearPCMIsBigEndianKey: 0,
AVLinearPCMIsFloatKey: 0,
AVLinearPCMBitDepthKey: 16,
AVLinearPCMIsNonInterleaved: 0
]
CADisplayLink
我在堆叠交换中可以找到的唯一类似问题是this,但问题是未明确的,答案无益(至少对我来说)。
起初我想也许问题可能是主队列超载,所以不知何故记录器的时间感变得臃肿(我认为
仍会构成不良行为),但在禁用动画(并尝试使用Timer而不是CADisplayLink)后,问题仍然存在!也许它仍然是一个线程问题,但我不明白为什么会这样。如果我确实需要多线程,我可以使用一些帮助理解和实现:)
任何想法都赞赏。
答案 0 :(得分:2)
在我使用AVAudioRecorder
的所有时间里,我最终不得不更换它。 AVAudioRecorder
是一个通用录音课程,所以一旦你的要求变得有点专业化,它就会让你失望。
然而,它确实进行了计量,这吸引了很多人。也许情况可以得到挽救。
的可能性:
一个。如果currentTime
不值得信任,那么就不要观察它!你有5秒钟的文件,所以也许可以找到一些其他的方法来标记你的应用程序中的那段时间。
湾属性currentTime
,头文件说:
only valid while recording
您是否仅在录制时对currentTime
进行采样?如果是这样可能是问题。在这种情况下,您可以使用deviceCurrentTime
属性,该属性始终有效,但您必须减去最初的deviceCurrentTime
。
如果情况无法挽救,您可以很快将[{1}}替换为AVAudioRecorder
和AVAudioEngine
,但这是另一天的问题。