简体   繁体   English

AVPlayerLayer 总是说 nil

[英]AVPlayerLayer says always nil

I don't understand why it is not working.我不明白为什么它不起作用。 I pass a videoURL trough a segue to a another ViewController.我通过一个segue 将一个videoURL 传递给另一个ViewController。 This works fine.这工作正常。

In the other ViewController I want to play the video.在另一个 ViewController 中,我想播放视频。 But for some reason it is not working.但由于某种原因它不起作用。 I unwrap the URL with optional binding.我使用可选绑定解开 URL。 But playerLayer does not accept the URL.但是 playerLayer 不接受 URL。 It says always nil.它说始终为零。

This is the URL: VideoURL Optional(file:///var/mobile/Containers/Data/Application/517BA864-F5CB-4E2C-BE54-D42555569266/Documents/3d.mov)这是 URL:VideoURL Optional(file:///var/mobile/Containers/Data/Application/517BA864-F5CB-4E2C-BE54-D42555569266/Documents/3d.mov)

My code:我的代码:

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

Try creating an AVURLAsset and an AVPlayerItem .尝试创建一个AVURLAsset和一个AVPlayerItem Then pass that AVPlayerItem into the AVPlayer rather than trying to use the URL init.然后将该AVPlayerItem传递到AVPlayer而不是尝试使用 URL init。

I tested this with a sample video I downloaded from here .我用从这里下载的示例视频对此进行了测试。 Note there is no sound in this video.请注意,此视频中没有声音。

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

Try the below code.试试下面的代码。 It's working.它正在工作。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM