AVPlayerLayer говорит, что всегда ноль - PullRequest
0 голосов
/ 13 февраля 2020

Я не понимаю, почему это не работает. Я передаю videoURL через переход к другому ViewController. Это отлично работает.

В другом ViewController я хочу воспроизвести видео. Но по какой-то причине это не работает. Я разворачиваю URL с необязательной привязкой. Но playerLayer не принимает URL. Здесь всегда указано nil.

Это URL: VideoURL Необязательно (файл: /// var / mobile / Containers / Data / Application / 517BA864-F5CB-4E2 C -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()
    }

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Попробуйте создать AVURLAsset и AVPlayerItem . Затем передайте это AVPlayerItem в AVPlayer вместо того, чтобы пытаться использовать URL init.

Я проверил это с примером видео, которое я скачал с здесь . Обратите внимание, что в этом видео нет звука.

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()
    }
}
1 голос
/ 13 февраля 2020

Попробуйте приведенный ниже код. Это работает.

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