使用AVPlayer,我们的iOS / Swift 4.2应用会播放100分钟左右的较大音频文件中的1:30分钟片段。
self.audioPlayer?.addPeriodicTimeObserver
命令,我们添加了一个周期性的时间观察器,该观察器(1)检查项目的当前时间是否在段结束之后。如果是,则我们停止播放,并尝试返回到该段的开头。 (2)更新UISlider控件在屏幕上的位置。请注意,在之前和之后,总是以0的公差调用seekto:
let seekto = CMTimeMakeWithSeconds(Double(self.audioSlider.value), preferredTimescale: Int32(NSEC_PER_SEC));
print("player:slider seekto:\(seekto.seconds)")
self.audioPlayer?.seek( to: seekto, toleranceBefore: CMTime.zero, toleranceAfter: CMTime.zero, completionHandler: { completed in
print("->seek to (from slider) completed:\(seekto.seconds), paused: \(self.paused)")
if (self.paused == false ) {
self.audioPlayer?.play()
}
});
如果我们从头到尾听片段,我们会得到一致的结果,即每次播放片段时在片段的开头和结尾听到的声音都是相同的。
但是: 使用按钮,我们寻找到片段结束之前3秒钟,然后收听结束。我们在结尾处的声音是一致的,但不同于我们从头到尾播放该片段时所听到的声音。
此外,如果我们使用滑块向段的末端滑动并搜寻到合适的位置并继续聆听末端,则会得到不一致的结果。声音不同于我们期望听到的声音和不使用滑块时听到的声音。
我们如何获得一致的结果?当使用seekto时,是什么导致播放的这种不一致?
编辑:这是一个说明问题的应用程序: https://github.com/christoforosl/SwiftAudioPlayerSample.git