AVAudioRecorder currentTime给出了错误的值

Bad*_*lan 10 avaudioplayer avaudiorecorder ios avaudiosession swift

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

  • 一个AVAudioRecorder火灾record(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)...所以观察a CADisplayLink应该产生currentTime值严格小于5.0?

问题是:这里可能出现什么问题?录音机正好在5秒后停止,但在内部它认为它录制时间超过5秒?我正在听我的所有录音,听起来不错.

我不确定它是否相关,但我AVAudioSession的类型AVAudioSessionCategoryPlayAndRecord,我的音频设置如下(所有这些除了采样率是以后分析所必需的):

audioSettings = [
    AVFormatIDKey: Int(kAudioFormatLinearPCM),
    AVSampleRateKey: 44100,
    AVNumberOfChannelsKey: 2,
    AVLinearPCMIsBigEndianKey: 0,
    AVLinearPCMIsFloatKey: 0,
    AVLinearPCMBitDepthKey: 16,
    AVLinearPCMIsNonInterleaved: 0
]
Run Code Online (Sandbox Code Playgroud)

我已经尝试摆弄所有这些,并没有看到任何改变行为.

CADisplayLink从主线程通过加入

recorderDisplayLink?.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
Run Code Online (Sandbox Code Playgroud)

我可以在堆栈交换中找到的唯一类似的问题就是这个,但是这个问题没有说明,答案也没有用(至少对我来说).
起初我想也许问题可能是主队列超载,所以不知何故记录器的时间感变得臃肿(我认为这仍然会构成不良行为),但是在禁用动画之后(并且还尝试使用Timer而不是CADisplayLink),问题仍然存在!也许它仍然是一个线程问题,但我不明白为什么会这样.如果我确实需要多线程,我可以使用一些帮助理解和实施:)任何想法赞赏.

Rhy*_*man 4

在我使用过的所有次数中AVAudioRecorder,我最终不得不更换它。AVAudioRecorder是一个通用的录音类,所以一旦你的要求变得有点专业化,它会让你失望。

然而,它确实具有测光功能,这也是吸引很多人使用它的原因。所以也许情况可以挽救。

可能性:

A。如果currentTime不值得信赖,那就不要遵守!您已经获得了 5 秒的文件,因此也许可以找到其他方法来在应用程序中标记该时间段。

b. 该属性的currentTime头文件显示:

  only valid while recording
Run Code Online (Sandbox Code Playgroud)

currentTime您只在录音时采样吗?如果是这样,那可能就是问题所在。在这种情况下,您可以使用该deviceCurrentTime属性,该属性始终有效,尽管您必须减去初始的deviceCurrentTime.

如果情况无法挽救,您可以很快用 和 替换AVAudioRecorderAVAudioEngine但这AVAudioFile是另一天的问题。