首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AVPlayer在iOS 15.4中查找completionHandler返回假

AVPlayer在iOS 15.4中查找completionHandler返回假
EN

Stack Overflow用户
提问于 2022-03-29 09:13:48
回答 1查看 351关注 0票数 3

我们正试图在我们的AVPlayer应用程序中实现SwiftUI搜索,它在iOS 15.4之前就开始工作了,但在更新之后就没有了。

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
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上寻找,但这也是行不通的。

代码语言:javascript
运行
复制
player.currentItem?.seek(to: time, toleranceBefore: CMTime.zero, toleranceAfter: CMTime.zero)

还有其他人经历过这样的事情,并且有什么指点吗?

更新:尝试了一次完整的基本尝试,但结果仍然相同:

代码语言:javascript
运行
复制
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)
            }
        }
    }
}

印“假”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-29 10:09:52

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

  1. 查找函数:

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) }

  1. 时间观测功能

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?}进行所需的操作。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71659358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档