Код: Выделить всё
func start() {
if let url = URL(string: cloudinaryUrl) {
self.avPlayerItem = AVPlayerItem(url: url)
self.avPlayer = AVPlayer(playerItem: avPlayerItem)
self.avPlayer?.rate = Float(rate.rate)
self.avPlayer?.play()
}
}
Код: Выделить всё
///View Model
func setTime(_ newValue: Double) {
guard let avPlayer = avPlayer, let avPlayerItem = avPlayerItem else { return }
let clampedValue = max(0, min(1, newValue))
let time = CMTimeGetSeconds(avPlayerItem.duration) * clampedValue
let cmtime: CMTime = CMTimeMake(value: Int64(time * 1000 as Float64), timescale: 1000)
avPlayer.seek(to: cmtime, toleranceBefore: .zero, toleranceAfter: .zero)
}
// SwiftUI View
@State var slider: Double = 0
Slider(value: $slider, in: 0...1, onEditingChanged: { moving in
viewModel.setTime(slider)
})
Однако у меня есть список кнопок с интервалами времени, например. 27.320. Когда я нажимаю кнопку, я хочу перейти к моменту времени с помощью аудиоплеера. Однако, похоже, это не всегда соответствует метке времени, и я не знаю, почему. Как ни странно, с первого раза он воспроизводится правильно, а затем при последующих щелчках воспроизводится на секунду или две назад.
Код: Выделить всё
// view model
func setTranscriptTime(_ newValue: Double) {
guard let avPlayer = avPlayer else {
setError(error: .noPlayer)
return
}
let cmtime: CMTime = CMTimeMake(
value: Int64(newValue * 1000 as Float64),
timescale: 1000
)
print(cmtime)
avPlayer.seek(
to: cmtime,
toleranceBefore: .zero,
toleranceAfter: .zero
)
}
// view
Button(action: {
viewModel.setTranscriptTime(dialogue[index].startTime)
}) {
Text(line.text)
}
Код: Выделить всё
CMTime(value: 27320, timescale: 1000, flags: __C.CMTimeFlags(rawValue: 1), epoch: 0)
Подробнее здесь: https://stackoverflow.com/questions/786 ... -audio-url