AVPlayer寻求不准确甚至toleranceBefore:kCMTimeZero

问题描述 投票:2回答:3

我们有起着很长的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,但(据我所知),我们有,因为我们需要更好的质量“光谱:”使用AVPlayer AVAudioTimePitchAlgorithm。
  • [编辑:] - 错误是一致的 - 它总是以相同的(错误的)地方对于给定的请求的位置播放。这也是重启后如此。

任何帮助,非常感谢!谢谢

[编辑:]

  • 我们已经尝试preferredTimescale: playerTimescale
  • 也试过kCMTimeIndefinite代替kCMTimeZero
swift avplayer avaudioplayer seek seektotime
3个回答
0
投票

这是AVURLAssetAVURLAssetPreferPreciseDurationAndTimingKey是。

Apple's documentation

当心,这应该增加加载时间。


2
投票

我做了一些类似,但采用了滑盖的改变演奏秒和完美。

 @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
            })
        }
    }

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

let trackStart = arrTracks![MediaPlayer.shared.currentSongNo].samples
let value = Float64(trackStart)
let seekTime = CMTime(value: CMTimeValue(value), timescale: 1)
MediaPlayer.shared.player?.seek(to: seekTime , completionHandler: { (completedSeek) in
                //do smthg later
            })

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()
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.