AVPlayer与AVPlayerViewController的播放控制

17

我将n个AVPlayer放置在视图控制器中,以定制视图控制器的其他元素,但我仍希望在不使用AVPlayerViewController时使用播放和刮擦控件。是否有一种方法可以为AVPlayer启用这些控件?


1
嘿,你解决了吗?我将AVPlayerViewController添加为子视图控制器,并保持其框架自定义。但是像播放、暂停、快进等控件都不可见。请帮忙。 - Ruchi
3个回答

35

不行。通常的解决方案(由苹果明确建议)是将AVPlayerViewController作为嵌入式视图控制器 - 即,使您的视图控制器成为自定义父视图控制器,而AVPlayerViewController则成为其子视图控制器,现在您可以将其视图(电影和控件)放置在您的视图中作为子视图以良好顺序。示例(self是您的视图控制器):

let url = // whatever
let player = AVPlayer(URL:url)
let avPlayerViewController = AVPlayerViewController()
avPlayerViewController.player = player
avPlayerViewController.view.frame = // whatever
self.addChild(avPlayerViewController)
self.view.addSubview(avPlayerViewController.view)
avPlayerViewController.didMove(toParent: self)

虽然这很好用,但是Xcode会显示以下错误:无法同时满足约束条件。看起来问题出在AVPlayerViewController中播放控件的自动布局上。不过我认为这可能是一个bug。 - JSNoob
1
无法在Swift 3.0中创建AVPlayerViewController对象。 - Ravi Ojha
2
@Natto 问问题按钮很大,是蓝色的,在右上方。 - matt

1

要使用Swift 5更新此帖子,您可以尝试以下代码:

let videoURL = URL(string: "https://your_video_in_internet.mp4")
let player = AVPlayer(url: videoUrl)
let playerViewController: AVPlayerViewController!
playerViewController = AVPlayerViewController()
playerViewController.view.frame = YOUR_FRAME_OR_EMBED_IN_STORYBOARD
playerViewController.player = player
playerViewController.showsPlaybackControls = true
playerViewController.videoGravity = .resizeAspectFill
YOUR_FRAME_OR_EMBED_IN_STORYBOARD.addSubview(playerViewController.view)
playerViewController.player!.play()  

这不会显示播放和拖动控件。 - Pete Streem
抱歉,我以为它已经这样做了。如果控件没有显示,你需要在AVPlayerController中添加这句话:"showsPlaybackControls = true"。 - Diego Jiménez
请问您能否编辑您的答案并加入控件吗?您的解决方案中没有提到AVPlayerController,因此我们不能仅仅将showPlaybackControlls设置为true。 - Samuel Folledo
完成了!我已经在答案中添加了控制器。 - Diego Jiménez
1
我不得不添加addChild(playerViewController)来使其工作。 - undefined

0
let player = AVPlayer(url: url)    
let playerViewController = AVPlayerViewController()
playerViewController.view.frame = self.videoPlayerView.bounds
playerViewController.player = player
self.addChild(playerViewController)
self.videoPlayerView.addSubview(playerViewController.view)
playerViewController.didMove(toParent: self)

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