[英]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.