AVPlayerLayer 总是说 nil

AVPlayerLayer says always nil

我不明白为什么它不起作用。我通过 segue 将视频 URL 传递到另一个 ViewController。这很好用。

在另一个 ViewController 我想播放视频。但由于某种原因,它不起作用。 我使用可选绑定打开 URL。但是 playerLayer 不接受 URL。它总是说零。

这是 URL: 视频URL 可选(file:///var/mobile/Containers/Data/Application/517BA864-F5CB-4E2C-BE54-D42555569266/Documents/3d.mov)

我的代码:

var player: AVPlayer?
var playerLayer: AVPlayerLayer?
var videoURL: URL?


    func playVideo() {

    if let _videoURL = videoURL {
        player = AVPlayer(url: _videoURL)

        playerLayer = AVPlayerLayer(layer: player!)

        playerLayer?.frame = contentView.layer.bounds

        playerLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill

        self.contentView.layer.addSublayer(playerLayer!)

        player?.play()
    }

试试下面的代码。有效。

var player: AVPlayer!
var playerLayer: AVPlayerLayer!

func playVideo() {
     if let url = videoURL {
    do {
        let item:AVPlayerItem = AVPlayerItem(url: url)
        player                = AVPlayer(playerItem: item)
        playerLayer           = AVPlayerLayer(player: player)
        playerLayer.frame     = contentView.bounds
        playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
        self.contentView.layer.addSublayer(playerLayer)
        player.play()
    } catch {
        print("Error1", error.localizedDescription)
    }
  }
}

尝试创建一个 AVURLAsset and an AVPlayerItem。然后将 AVPlayerItem 传递给 AVPlayer 而不是尝试使用 URL init。

我用从 here 下载的示例视频对此进行了测试。请注意,此视频中没有声音。

import UIKit
import AVFoundation

class ViewController: UIViewController {
    private let videoUrl = Bundle.main.url(forResource: "file_example_MOV_1920_2_2MB", withExtension: "mov")!
    private var videoPlayer: AVPlayer?
    private var playerLayer: AVPlayerLayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        playVideo()
    }

    func playVideo() {
        let asset = AVURLAsset(url: videoUrl)
        let primaryPlayerItem = AVPlayerItem(asset: asset)

        let player = AVPlayer(playerItem: primaryPlayerItem)

        let videoLayer = AVPlayerLayer(player: player)
        videoLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
        videoLayer.frame = view.bounds

        view.layer.addSublayer(videoLayer)
        videoPlayer = player
        playerLayer = videoLayer
        videoPlayer?.play()
    }
}