【问题标题】:AVPlayerLayer says always nilAVPlayerLayer 总是说 nil
【发布时间】:2020-05-29 04:37:54
【问题描述】:

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

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

这是 URL:VideoURL Optional(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()
    }

【问题讨论】:

  • 你可能没有解开你在 videoURL 初始化器中给出的字符串..
  • 播放器有值,但playerLayer不接受值

标签: ios swift xcode avfoundation avplayerlayer


【解决方案1】:

试试下面的代码。它正在工作。

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

【讨论】:

  • 你能告诉我我的旧代码有什么问题吗?
  • 在没有try 调用的情况下,为什么要使用do 块? "'catch' 块无法访问,因为 'do' 块中没有抛出错误"
  • @adri567 你在 AVPlayerItem 中传递了你的本地文件 url 路径。因为 AVPlayerItem 存储了对 AVAsset 对象的引用,该对象代表要播放的媒体。
【解决方案2】:

尝试创建AVURLAssetAVPlayerItem。然后将 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()
    }
}

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 2019-12-22
    • 2017-03-28
    • 2015-03-05
    • 2014-08-25
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多