AVPlayerLooper 不循环我的本地视频

问题描述 投票:0回答:2

我正在尝试在我的 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,我已将其连接到我的视图控制器。

它构建并运行良好,但当我运行它时,什么也没有显示。我只是遇到黑屏。

如有任何帮助,我们将不胜感激。谢谢!

ios swift macos avfoundation avkit
2个回答
6
投票
  • AVPlayerLoop 是一种管理播放器和播放器项目的“顶级”对象。所以你必须保留它,例如在视图控制器的自定义属性中,否则它将在它真正执行任何操作之前被释放

  • 由于AVPlayerLoop管理AVQueuePlayer中的项目,因此初始化队列播放器而不传入播放器项目


0
投票

这里的回复有点晚了。自您 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)
© www.soinside.com 2019 - 2024. All rights reserved.