首页 文章

AVAudioRecorder currentTime给出了错误的值

提问于
浏览
9

我有一个如下设置,在带有iOS 10.3的iPhone 5s上进行测试,无论是进出调试 .

  • An AVAudioRecorder fires record(forDuration: 5.0)

  • A CADisplayLink 监视录像机的水平(录像机是 meteringEnabled ),同步动画,并跟踪 recorder.currentTime (但问题可以通过最低限度地跟踪显示链接中的时间来再现)

  • recorder.currentTime 的报告始终达到> 5(通常为5.2到5.5)的值 . 结果与 recorder.deviceTimeCFAbsoluteTimeGetCurrent 的值基本一致

  • 我初始化 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 回答

  • 1

    在我使用 AVAudioRecorder 的所有时间里,我最终不得不更换它 . AVAudioRecorder 是一个通用的录音课程,所以一旦你的要求变得有点专业化,它就会让你失望 .

    然而,它确实做了计量,这吸引了很多人 . 所以也许情况可以得到挽救 .

    可能性:

    一个 . 如果 currentTime 不是't trustworthy, then don' t观察它!你有5秒钟的文件,所以也许可以找到一些其他方法来标记你的应用程序中的那段时间 .

    湾属性 currentTime ,头文件说:

    仅在录制时有效

    您是否只在录制时对_1002671进行采样?如果是这样可能是问题 . 在这种情况下,您可以使用 deviceCurrentTime 属性,该属性始终有效,但您必须减去初始 deviceCurrentTime .

    如果情况无法挽救,你可以很快用 AVAudioEngineAVAudioFile 替换 AVAudioRecorder ,但这是另一天的问题 .

相关问题