如何在UIView中播放视频(使用Swift)?

21

我有一个视频想要从服务器上下载并在固定视图中流式传输。我在Storyboard中设置了一个带有固定约束的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下方的其他项目。如何以正确的方式在视图中播放视频?

2
可能是将本地视频嵌入到UIView中的重复问题。 - SPatel
1
@SPatel,你提到的链接是关于如何通过编程创建视图的,但我的问题是我的视频不适合我的UIView。我在你提供的链接中没有找到答案,抱歉:( - Azin Nilchi
5个回答

31

如果您想使用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()

我觉得你没有理解我的问题!第一种方式只是呈现视频,而不是在一个框架中打开另一个视图!第二种方式不能正常工作!请在不同的设备上测试它! - Azin Nilchi
1
AVPlayer部分对我来说完美无缺,只需要将框架更改到我想要的位置即可。谢谢! - Pointblaster

15

在Storyboard中为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)

我希望其他人也能使用这个!:)


12
你可以尝试在 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 上,框架不是我在 storyboard 中设置的!另外一件事是播放控制不再显示 :( - Azin Nilchi

2

以下是如何在 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()
}

这不是将子视图控制器添加到父视图控制器的正确方式。同时,这也是错误使用 AVPlayerViewController 的方式。 - HangarRash

-1
import AVKit
import AVFoundation
import UIKit
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let player = AVPlayer(url: URL(fileURLWithPath: Bundle.main.path(forResource: "shiv", ofType: "mp4")!))
    
        let vc = AVPlayerViewController()
        vc.player = player
        present(vc, animated: true)
    }
}

目前您给出的回答不够清晰。请进行[编辑]并添加更多细节,以便其他人能够理解其与所提问的问题之间的关联。您可以访问帮助中心了解如何撰写高质量的回答。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接