使用seekto时音频段结束时间不正确

时间:2018-12-14 14:26:31

标签: ios swift audio avplayer avplayeritem

使用AVPlayer,我们的iOS / Swift 4.2应用会播放100分钟左右的较大音频文件中的1:30分钟片段。

  1. 在屏幕加载(viewdidload)上,我们创建音频并将其加载到AVPlayerItem中,然后将此AVPlayerItem分配给AVPlayer。
  2. 在forKeyPath:“状态”上使用观察器,当项目处于状态AVPlayer.Status.readyToPlay时,我们将查找到片段的开始位置,然后发出播放命令。
  3. 使用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

0 个答案:

没有答案