我们正试图在我们的AVPlayer应用程序中实现SwiftUI搜索,它在iOS 15.4之前就开始工作了,但在更新之后就没有了。
let playerCurrentTime = CMTimeGetSeconds(player.currentTime())
let newTime = playerCurrentTime + 45
let time2: CMTime = CMTimeMake(value: Int64(newTime * 1000 as Float64), timescale: 1000)
player.seek(to: time2, toleranceBefore: CMTime.zero, toleranceAfter: CMTime.zero) { success in
print(success)
}立即调用completionHandler,成功= false。没有其他的搜索操作正在运行,而且AVPlayer状态是readyToPlay。
我们使用以下初始化代码从URL中传输一个MP3文件:
playerItem = AVPlayerItem(url: url)
player = AVPlayer(playerItem: playerItem)
player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 2), queue: DispatchQueue.main) { _ in
if self.player.currentItem?.status == .readyToPlay {
self.currentTimeInSeconds = CMTimeGetSeconds(self.player.currentTime())
self.progressInPct = Double(self.currentTimeInSeconds) / Double(self.totalTimeInSeconds)
self.nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 1
MPNowPlayingInfoCenter.default().nowPlayingInfo = self.nowPlayingInfo
self.setupNowPlaying()
} else {
self.nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 0
MPNowPlayingInfoCenter.default().nowPlayingInfo = self.nowPlayingInfo
}
}我们也尝试过在currentItem上寻找,但这也是行不通的。
player.currentItem?.seek(to: time, toleranceBefore: CMTime.zero, toleranceAfter: CMTime.zero)还有其他人经历过这样的事情,并且有什么指点吗?
更新:尝试了一次完整的基本尝试,但结果仍然相同:
struct testView: View {
var player = AVPlayer()
var body: some View {
Button {
self.startPlayer(url: episode.streamUrl!)
}
label: {
Text("Test")
}
}
func startPlayer(url: String) {
let playerItem = AVPlayerItem(url: URL(string: url) !)
self.player.replaceCurrentItem(with: playerItem)
player.play()
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
let time2: CMTime = CMTimeMake(value: Int64(45 * 1000 as Float64), timescale: 1000)
player.seek(to: time2, toleranceBefore: CMTime.zero, toleranceAfter: CMTime.zero) {
success in
print(success)
}
}
}
}印“假”。
发布于 2022-03-29 10:09:52
为了便于比较,我附上了一段用于时间观察的代码和3种类型的查找函数。到目前为止,它在iOS 15.4上运行良好(尽管在UIKit上和.m3u8播放列表上)。希望能在某种程度上对你有所帮助。
func seek1() { let videoDuration = (avPlayer.currentItem?.duration.seconds ??0)!设elapsedTime: Float64 = videoDuration * Float64(archiveControlsView.seekSlider.value)让toTime =CMTime.init(秒: elapsedTime,preferredTimescale: 100) avPlayer.seek(to: toTime,completionHandler:{(已完成: Bool) -> Void /do you需要}) } func seek2() { let diff : TimeInterval = 60 self.avPlayer.seek(to: CMTime.init(秒:diff),preferredTimescale: 100)} seekToZero() { self.avPlayer.seek(to: kCMTimeZero) }
timeObserver: AnyObject!func createTimer() { let timeInterval: CMTime =CMTime.init(秒数: 1.0,preferredTimescale: 10) timeObserver = avPlayer.addPeriodicTimeObserver(forInterval: timeInterval,queue: DispatchQueue.main) { (elapsedTime: CMTime) -> timeInterval != .Seeking return {返回} self.observeTime(elapsedTime)让持续时间=(.Seeking ? 0)!让elapsedTime = elapsedTime.seconds //对AnyObject?}进行所需的操作。
https://stackoverflow.com/questions/71659358
复制相似问题