如何在 UIView swift 中播放视频?

Posted

技术标签:

【中文标题】如何在 UIView swift 中播放视频?【英文标题】:how to play a video in UIView swift? 【发布时间】:2018-06-02 05:24:19 【问题描述】:

我有一个视频,我想从服务器下载并在固定视图中流式传输它。 我在我的故事板中设置了一个带有固定约束的 UIView,这是我在代码中所做的:

@IBOutlet weak var videoView: UIView!
var player: AVPlayer!
var avpController = AVPlayerViewController()

在我的viewDidLoad 中,我已经这样做了:

let url = URL(string:myURL)
player = AVPlayer(url: url!)

avpController.player = player
avpController.videoGravity = AVLayerVideoGravity.resizeAspect.rawValue
self.addChildViewController(avpController)
avpController.view.frame = videoView.frame
self.containerView.addSubview(avpController.view)
videoView.layer.masksToBounds = true

我的问题是我的视频不是我设置为videoView 的大小,而且在每个设备上我的视频大小都不同。在某些设备中,视频高度大于我设置的高度,它覆盖了我在videoView 下方的项目。如何以正确的方式在视图中播放视频?

【问题讨论】:

Embedding a local video into a UIView的可能重复 @SPatel 你提到的链接,以编程方式创建一个视图,我的问题是我的视频不适合我的 UIView。我在你的链接中找不到我的答案,对不起:( 【参考方案1】:

如果你想使用 AVPlayerViewController:

let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
self.present(playerViewController, animated: true) 
    playerViewController.player!.play()

对于 AVPlayer:

let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer)
player.play()

【讨论】:

我想你没有得到我的问题!第一种方式,只是呈现视频而不是在一个框架中并打开另一个视图!第二种方式,无法正常工作!在不同的设备上测试它! AVPlayer 部分对我来说完美无缺,只需将框架更改为我想要的位置。谢谢!【参考方案2】:

将视频添加到情节提要中具有固定约束的 UIView 的唯一方法是:

let url = URL(string:myURL)

player = AVPlayer(url: url!)

avpController.player = player

avpController.view.frame.size.height = videoView.frame.size.height

avpController.view.frame.size.width = videoView.frame.size.width

self.videoView.addSubview(avpController.view)

我希望其他人可以使用它! :)

【讨论】:

【参考方案3】:

您可以尝试在AVPlayer 中使用AVPlayerLayer

      let player = AVPlayer(url: video) // your video url
      let playerLayer = AVPlayerLayer(player: player)
      playerLayer.frame = videoView.bounds
      videoView.layer.addSublayer(playerLayer)
      player.play()

【讨论】:

感谢您的回答,它适用于 iphone X,但在 iphone 5s 甚至 8 plus 中,框架不是我在情节提要中设置的!另一件事是播放器控件不再显示:(【参考方案4】:

这是在uiview中添加和删除播放器的方法。

var player: AVPlayer?
var playerController: AVPlayerViewController?
func removePlayer() 
    player?.pause()
    player = nil
    playerController?.player?.pause()
    playerController?.player = nil
    if let view = playerController?.view 
        videoView.willRemoveSubview(view)
    
    playerController?.view.removeFromSuperview()
    playerController = nil


func setVideo(url: URL) 
    removePlayer()
    player = AVPlayer(url: url)
    playerController = AVPlayerViewController()
    playerController?.player = player
    self.videoView.addSubview((playerController?.view)!)
    playerController?.view.frame = CGRect(x: 0, y: 0, width: self.videoView.bounds.width, height: self.videoView.bounds.height)
   // player.play()

【讨论】:

以上是关于如何在 UIView swift 中播放视频?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVPlayer 播放的视频在 swift3 中从其容器视图中消失

如何在没有控件的 UIView 中播放视频,如背景/壁纸?

如何使用 XCDYouTubeKit for Swift 在播放列表中播放下一个 youtube 视频?

如何在 macOS 应用程序中使用 swift 播放视频?

在 swift 中,如何在 AVPlayerViewController 中播放视频时检测触摸

如何在 iOS Swift 中播放 Vimeo 视频?