2017-04-11 35 views
8

我有一个设置如下,在iOS5.3s上测试iPhone5s,无论是否进行调试。AVAudioRecorder currentTime给出了错误的值

  • 一种AVAudioRecorder火灾record(forDuration: 5.0)
  • CADisplayLink手表记录器的水平(记录器是meteringEnabled),同步的动画,和跟踪的recorder.currentTime(但问题可以通过最低限度地保持的时间轨道被再现在显示链接中)
  • recorder.currentTime的报告始终达到> 5的值(通常为5.2-5.5)。结果与recorder.deviceTimeCFAbsoluteTimeGetCurrent
  • 的值基本一致初始化AVAudioPlayer并验证声音资产确实具有精确5.0秒的持续时间。

从我的理解,录音机的currentTime在几秒钟内进行测量,并重置为0.0时recorder.isRecording恢复到假,记录停止时会立即发生(这是我所看到的在audioRecorderDidFinishRecording一致).. 。因此,使用CADisplayLink观察时应该产生严格小于5.0的currentTime值?

问题是:这里可能会出现什么问题?记录仪正好在5秒后停止,但在内部它认为记录时间超过5秒?我正在听我的所有录音,他们听起来很好。

我不知道,如果是相关的,但我的AVAudioSessionAVAudioSessionCategoryPlayAndRecord型的,和我的音频设置如下(所有这些除外采样率是必要的供日后分析):

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),问题依然存在!也许它仍然是一个线程问题,但我不明白为什么会这样。如果我需要多线程,我可以使用一些帮助理解和实施:) 任何想法赞赏。

+0

所以问题是为什么你要比'recordForDuration:'要求的持续时间多0.2秒到0.5秒? –

+0

问题是,以下两条语句如何同时兼容: (1)记录(forDuration:5.0)产生的确切记录时间为5.0秒 (2)计时器观察记录仪的currentTime属性, > 5.0 –

+0

TL; DR'AVAudioRecorder'不太好,请替换它。看到我的答案为更细致的版本。 –

回答

0

在我用过的所有时间AVAudioRecorder中,我最终不得不取代它。 AVAudioRecorder是一个通用录音班,所以一旦你的要求变得有点专业化,它会让你失望。

然而,它确实测量,这是什么吸引了很多人。所以也许情况可以得到挽救。

可能性:

a。如果currentTime不可信,那就不要观察它!你已经有了5秒钟的文件,所以也许可以通过其他方式在你的应用程序中标记一段时间。

b。该物业currentTime的,头文件说:

only valid while recording 

你采样currentTime只在记录?如果这样可能是问题。在这种情况下,您可以使用deviceCurrentTime属性,该属性始终有效,但您必须扣除最初的deviceCurrentTime

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

+0

是的,我正在考虑取代它,但是如果可能的话,我想不要......这是吸引我的计量。基本上,我正在观看录音机的平均功率,以提供动画和静音。这是我需要'currentTime'属性的第二部分。但我需要这些时间与“AVAudioPlayer”和“AVReader”对时间的感知一致。 –

+0

哦,我也应该澄清一下:当'isRecording'为true时,我只报告'currentTime'的值。这意味着当'currentTime'超过实际的音频持续时间时录音机仍在录音,或'isRecording'实际上不指示录音机正在做什么。但也许标题说明了一切。 “'只有在录音时有效(但不要下注)'” –

+0

我确实尝试过使用录音机的'deviceCurrentTime'属性,但发现它的行为同样奇怪。也许我应该在记录仪之外使用不同的设备时间测量值? –