我们正在try 在我们的SwiftUI应用程序中实现AVPlayer seek,它在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立即被调用,success=false.

我们正在使用以下初始化代码从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)
            }
        }
    }
}

打印"假".

推荐答案

为了进行比较,我附上了一段用于时间观测的代码和3种类型的搜索函数.到目前为止,它在iOS 15.4上运行良好(尽管在UIKit和.m3u8播放列表上).希望它能对你有所帮助.

  1. 寻找功能:

    func seek1() {
     let videoDuration = (avPlayer.currentItem?.duration.seconds ?? 0)!
     let elapsedTime: Float64 = videoDuration * Float64(archiveControlsView.seekSlider.value)
     let toTime = CMTime.init(seconds: elapsedTime,
                              preferredTimescale: 100)
     avPlayer.seek(to: toTime,completionHandler: { (completed: Bool) -> Void in
         //do whatever you need
     })
    }
    
    func seek2() {
     let diff: TimeInterval = 60
     self.avPlayer.seek(to: CMTime.init(seconds: diff,   preferredTimescale: 100))
    }
    
    func seekToZero() {
     self.avPlayer.seek(to: kCMTimeZero)
    }
    
  2. 时间观测函数

    var timeObserver: AnyObject!
    
    func createTimer() {
     let timeInterval: CMTime = CMTime.init(seconds: 1.0, preferredTimescale: 10)
    
     timeObserver = avPlayer.addPeriodicTimeObserver(forInterval: timeInterval,
                                                     queue: DispatchQueue.main) {
         (elapsedTime: CMTime) -> Void in
    
         guard self.status != .Seeking else { return }
         self.observeTime(elapsedTime)
         let duration = (self.avPlayer.currentItem?.duration.seconds ?? 0)!
         let elapsedTime = elapsedTime.seconds
         // do whatever you need with elapsed and duration
     } as AnyObject?
    }
    

Swift相关问答推荐

同步问题,发送Api Call之前未设置idToken

日期格式yyyyyy—MM—dd hh:mm:ss +0000到dd MMM,以swift格式表示""""

在解码字符串时需要帮助.

.onReceive NSWindow.CloseNotify是否会为App中的每个窗口调用?

Swift-Can无法在AudioKit中找出简单的麦克风效果-文件链

在NavigationStack上设置拐角半径:SwiftUI中的无响应内容视图区

BLE 在 ESP32 和 Iphone 之间发送字符串

SwiftUI:列表背景为空列表时为黑色

Swift Property Wrappers-Initialization 失败并显示无法将‘Double’类型的值转换为预期的参数类型

memcpy 复制带偏移量的数组

如何从 Swift 中隐藏 Objective-C 类接口的一部分?

Swift Combine:如何在保留发布者结果顺序的同时进行收集?

我如何遵守与演员的协议?

如何在 SwiftUI 中用图像替换占位符文本?

RxSwift 提高性能

响应 UITextField (UIViewRepresentable) 中的特定按键

如何 for each 用户制作一个单独的按钮,以便在按下它时切换 isFollowingUser Bool 并更改为关注?

如何获得不同的插入和移除过渡动画?

在 Swift 4 中实现自定义解码器

如何发送静默推送通知有效负载