gpt4 book ai didi

swift - AVPlayer 的 addPeriodicTimeObserver 函数未正确执行

转载 作者:行者123 更新时间:2023-11-28 07:48:32 29 4
gpt4 key购买 nike

背景

我正在尝试在 macOS 应用程序中设置一个非常基本的音频播放器。我在 ma​​cOS 10.13.4 上使用 Xcode 9.3


设置

我有一个 MediaManager 类来控制 AVPlayer 对象:

let EPISODE_SELECTED_KEY = "EPISODE_SELECTED"

class MediaManager {

static var shared: MediaManager = MediaManager()

var player: AVPlayer?

var currentFile: URL? {
didSet {
if (currentFile != nil) {
play(URL: currentFile!)
NotificationCenter.default.post(name: NSNotification.Name(EPISODE_SELECTED_KEY), object: nil)
}
}
}


func play(URL: URL) {
let item = AVPlayerItem(url: URL)
player = AVPlayer(playerItem: item)
player?.play()
}

}

为了直观地跟踪正在播放的音频项目的进度,我将 NSSlider 子类化为:

class PlayerSlider: NSSlider {

var observerToken: Any?
var mediaManager = MediaManager.shared

override var isEnabled: Bool {
didSet {
// Register for PlayerManager notification.
NotificationCenter.default.addObserver(self, selector: #selector(setupPlayerObserver), name: Notification.Name(EPISODE_SELECTED_KEY), object: nil)
}
}

override var doubleValue: Double {
didSet {
// Make sure the player has an active item.
guard mediaManager.currentEpisode != nil || mediaManager.currentFile != nil else {
return
}
// Update player with slider's position.
let seekTime = CMTime(seconds: (mediaManager.player?.currentTime().seconds)! * (doubleValue / 100), preferredTimescale: CMTimeScale(NSEC_PER_SEC))
mediaManager.player?.seek(to: seekTime)
}
}

@objc func setupPlayerObserver() {
// Setup observer to update UI every 0.5 seconds.
let interval = CMTime(seconds: 0.5, preferredTimescale: CMTimeScale(NSEC_PER_SEC))
self.observerToken = mediaManager.player!.addPeriodicTimeObserver(forInterval: interval, queue: .main, using: { (time) in
// Update slider value to audio item progress.
let duration = self.mediaManager.player!.currentItem!.duration.seconds
let seekTime = self.mediaManager.player!.currentTime().seconds
self.doubleValue = seekTime / duration * 100
})

}
}

出于测试目的,我只是将 MediaManager 单例的 currentFile 属性设置为本地文件。


问题

在我传递给 addPeriodicTimeObserver 函数的 block 中,如果我注释掉所有内容,文件将正常播放。但是,如果那里甚至有打印语句,则什么也不会发生。文件从不播放,应用只是挂起。


问题

  1. 那个街区里发生了什么?即使是一条语句也会停止播放 AVPlayer
  2. 对于音频文件播放器来说,这是一个好的设计吗?在 PlayerSlider 中拥有 MediaManager 单例和监听器。

最佳答案

您所写的是要求定期观察员每 0.5*109 秒给您回电,但 0.5 向下舍入为 0,所以它是每 0 秒。两者都不可能(为什么 addPeriodicTimeObserver 没有提到它?),所以尝试

let interval = CMTime(value: 1, timescale: 10)  // every tenth of a second, say

关于swift - AVPlayer 的 addPeriodicTimeObserver 函数未正确执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50310159/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com