我正在尝试在我的 macOS 项目中播放视频,并且希望它不断循环。我能够让它播放一次,但我不知道如何让它循环播放。我正在使用 AVPlayerLooper 但似乎在某个地方搞砸了。这是我的代码:
import Cocoa
import AVKit
import AVFoundation
class ViewController: NSViewController {
@IBOutlet weak var videoPlayer: AVPlayerView!
override func viewDidLoad() {
//var loop: AVPlayerLooper?
super.viewDidLoad()
guard let path = Bundle.main.path(forResource: "Background", ofType:"mp4") else {
debugPrint("Not found")
return
}
let asset = AVAsset(url: URL(fileURLWithPath: path))
let item = AVPlayerItem(asset: asset)
let queuePlayer = AVQueuePlayer(playerItem: item)
let loop = AVPlayerLooper(player: queuePlayer, templateItem: item)
videoPlayer.player = queuePlayer
videoPlayer.player?.play()
}
}
我的故事板中还有一个 AVPlayerView,我已将其连接到我的视图控制器。
它构建并运行良好,但当我运行它时,什么也没有显示。我只是遇到黑屏。
如有任何帮助,我们将不胜感激。谢谢!
AVPlayerLoop 是一种管理播放器和播放器项目的“顶级”对象。所以你必须保留它,例如在视图控制器的自定义属性中,否则它将在它真正执行任何操作之前被释放
由于AVPlayerLoop管理AVQueuePlayer中的项目,因此初始化队列播放器而不传入播放器项目
这里的回复有点晚了。自您 2018 年提出问题以来,现在有了更好的指导。 仔细查看 WWDC22“使用 AVFoundation 和 Metal 在 EDR 中显示 HDR 视频”中的示例代码。 https://developer.apple.com/wwdc22/110565
WWDC 会议非常拥挤。对我来说,需要多次重播才能真正吸收指导。
我发现AVPlayerLoop需要将AVPlayerItemVideoOutPut对象中的videoColorProperties和outPutSettings添加到AVPlayerLoop中repeatingItems的每个成员中。 AVPlayerItemVideoOutPut 的文档中暗示了这一点
我在您的代码示例中没有看到任何正在监听的内容
hasNewPixelBuffer(forItemTime: currentTime)
当有新的缓冲区帧时,请复制 PixelBuffer,如 WWDC 会话中的示例代码所示。缺少帧更新可以解释您的黑屏。
copyPixelBuffer(forItemTime: currentTime,
itemTimeForDisplay: nil)