2

我们有一个可以播放长 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
4

3 回答 3

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
            })
于 2019-02-08T09:18:36.217 回答
1

这就是AVURLAsset'sAVURLAssetPreferPreciseDurationAndTimingKey的用途。

苹果的文档

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

于 2019-02-11T12:41:29.570 回答
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()
        }
    }
}
于 2019-02-08T11:37:59.803 回答