AVPlayerLayer 不播放视频但音频很好

Posted

技术标签:

【中文标题】AVPlayerLayer 不播放视频但音频很好【英文标题】:AVPlayerLayer not playing video but the audio is good 【发布时间】:2019-12-26 03:51:05 【问题描述】:

我有一个令人困惑的问题。 我在课堂上声明了这些变量:

var audioPlayer = AVPlayer()
var videoPlayer = AVPlayer()
var videoLayer = AVPlayerLayer()

我有这些代码用于添加 videoPlayer 的容器:

let aspectHeight = view.frame.width * 9/16
let viewFrame = CGRect(x: 5, y: 0, width: view.frame.width - 10, height: aspectHeight)
let layerFrame = CGRect(x: 0, y: 0, width: view.frame.width - 10, height: aspectHeight)

videoPlayerContainerView.frame = viewFrame
videoPlayerViewController.frame = viewFrame
videoLayer.frame = layerFrame

videoLayer.backgroundColor = UIColor.green.cgColor
videoPlayerContainerView.layer.addSublayer(videoLayer)
videoPlayerContainerView.addSubview(videoPlayerViewController)

videoElementContainerView.addView(newView: videoPlayerContainerView)

我也有这个功能(我用临时 URL 替换了传递的参数):

@IBAction func pausePlayVideo(_ sender: CustomButton) 
    let videoString = videoSourceURL + (sender.paramaters["thisVideoURL"] as! String)
    let videoURL = URL(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
    videoPlayer = AVPlayer(url: videoURL!)
    videoLayer = AVPlayerLayer(player: videoPlayer)

    videoPlayer.play()

我在这里称呼它:

pausePlayButton.addTarget(self, action: #selector(ModuleLessonElementsViewController.pausePlayVideo(_:)), for: .touchUpInside)
pausePlayButton.paramaters["thisVideoURL"] = content

以下是视图: The layer was added, the audio plays but the video does not.

按下按钮时,会播放音频,但不会播放视频。我在这里错过了一些重要的事情吗?

【问题讨论】:

添加你的视频层在最后添加子层代码。这是唯一的问题。现在视频播放器控制器已添加到您的图层上方 【参考方案1】:

这很简单。早些时候,你说:

videoPlayerContainerView.layer.addSublayer(videoLayer)

好的,所以你有一个播放器层videoLayer,与没有播放器相关联,现在它在界面中。很好。

稍后,当按下按钮时,你说:

@IBAction func pausePlayVideo(_ sender: CustomButton) 
    // ...
    videoLayer = AVPlayerLayer(player: videoPlayer)
    videoPlayer.play()

那么刚刚发生了什么?您将videoLayer 中的引用丢弃到您之前添加到界面中的层,并用您刚刚创建的全新播放器层替换它,并且在界面中不是。好的,所以您与播放器关联的视频层不在界面中,因此您可以听到播放器但看不到任何内容。

【讨论】:

哦,所以我应该做的是videoLayer.player = videoPlayer。非常感谢!另外,我做了所有这些,以便我可以从 API 播放多个视频。这种方法可以@matt 工作吗?

以上是关于AVPlayerLayer 不播放视频但音频很好的主要内容,如果未能解决你的问题,请参考以下文章

全屏:调整其父视图的大小时不调整 AVPlayerLayer 的大小

AVPlayerLayer 尺寸不正确

搜索文件时 MPMoviePlayer 播放音频但不播放视频

avaudioplayer 干扰 ipad 上的 mpmovieplayer

MPMoviePlayerViewController 仅显示视频但不播放音频 iOS 8

Unity 2D 中的视频播放器播放音频但在处于非活动状态后设置为活动时不显示视觉效果