AVPlayer甚至在容差范围内也无法准确找到之前:kCMTimeZero

时间:2019-02-08 09:11:18

标签: swift avplayer avaudioplayer seek seektotime

我们有一个可以播放长mp3文件(长1小时)的应用。我们希望能够从文件中的设置点开始播放。但是,当我们执行此操作时,最多10秒是不准确的。

代码如下:

  let trackStart = arrTracks![MediaPlayer.shared.currentSongNo].samples

  let frameRate : Int32 = (MediaPlayer.shared.player?.currentItem?.asset.duration.timescale)!

  MediaPlayer.shared.player?.seek(to: CMTimeMakeWithSeconds(Double(trackStart), frameRate), 
    toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)
  • 我们必须使用AVPlayer,因为我们需要质量更好的“光谱”:AVAudioTimePitchAlgorithm。
  • 我们没有遇到AVAudioPlayer的问题,但是(AFAIK)我们必须使用AVPlayer,因为我们需要质量更好的“光谱”:AVAudioTimePitchAlgorithm。

  • [编辑:]-错误是一致的-对于给定的请求位置,它始终从同一(错误)位置播放。重新启动后也是如此。

非常感谢您的帮助!谢谢

[编辑:]

  • 我们已经尝试过preferredTimescale: playerTimescale
  • 还尝试了kCMTimeIndefinite而不是kCMTimeZero

3 个答案:

答案 0 :(得分:2)

我做过类似的事情,但是使用滑块可以更改播放秒数,并且效果很好。

def form_valid(self, form):
    form.instance.slug = slugify(uuid.uuid4())
    return super().form_valid(form)

在这种情况下,将是这样的:

 @objc func handleSliderChange(sender: UISlider?){
        if let duration = player?.currentItem?.duration{
            let totalSeconds = CMTimeGetSeconds(duration)
            let value = Float64(videoSlider.value) * totalSeconds
            let seekTime = CMTime(value: CMTimeValue(value), timescale: 1)
            player?.seek(to: seekTime , completionHandler: { (completedSeek) in
                //do smthg later
            })
        }
    }

答案 1 :(得分:0)

尝试一下,对我来说效果很好

@IBAction func playbackSliderValueChanged(_ playbackSlider: UISlider) {
    let seconds : Int64 = Int64(playbackSlider.value)
    let targetTime: CMTime = CMTimeMake(value: seconds, timescale: 1)
    DispatchQueue.main.async {
        self.player!.seek(to: targetTime)
        if self.player!.rate == 0 { // if the player is not yet started playing
            self.player?.play()
        }
    }
}

答案 2 :(得分:0)

这就是AVURLAsset的{​​{1}}的作用。

Apple's documentation

请注意,这会增加加载时间。