我们有一个可以播放长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)
我们没有遇到AVAudioPlayer的问题,但是(AFAIK)我们必须使用AVPlayer,因为我们需要质量更好的“光谱”:AVAudioTimePitchAlgorithm。
[编辑:]-错误是一致的-对于给定的请求位置,它始终从同一(错误)位置播放。重新启动后也是如此。
非常感谢您的帮助!谢谢
[编辑:]
preferredTimescale: playerTimescale
kCMTimeIndefinite
而不是kCMTimeZero
答案 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)