如何在没有控件的 UIView 中播放视频,如背景/壁纸?
Posted
技术标签:
【中文标题】如何在没有控件的 UIView 中播放视频,如背景/壁纸?【英文标题】:How to play video inside a UIView without controls, like a background/wallpaper? 【发布时间】:2016-02-05 14:26:05 【问题描述】:目标是在没有控件的 UIView 内播放视频文件 (*.mp4)。
它将作为 ViewController 和其他控件的背景/壁纸,即表格视图、文本字段、图像将显示在视图上并播放视频。
有什么更好的方法来做到这一点? 谢谢
【问题讨论】:
是本地视频还是使用 URL 的 YouTube 视频? 它将是本地文件导入到项目中。实际上会有几个文件(视频)分别用于单独的 ViewController 参考***.com/questions/17922017/… 据我所知,MPMoviePlayerController
在 ios 9 中已被弃用。应该使用 AVPlayerViewController
类。问题仍然存在:如何在没有控件的框架 uiview 中显示视频(不在 webview 中)?
Swift,更简短的答案:solution 1solution 2
【参考方案1】:
我已经用原生AVPlayer
达到目标了
1.使用过的AVFoundation:
#import <AVFoundation/AVFoundation.h>
2.播放器的Used属性:
@property (nonatomic) AVPlayer *avPlayer;
3.将视频文件添加到“视频”文件夹中,并将“视频”添加到项目中
4.初始化播放器
NSString *filepath = [[NSBundle mainBundle] pathForResource:@"shutterstock_v885172.mp4" ofType:nil inDirectory:@"Video"];
NSURL *fileURL = [NSURL fileURLWithPath:filepath];
self.avPlayer = [AVPlayer playerWithURL:fileURL];
self.avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
AVPlayerLayer *videoLayer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer];
videoLayer.frame = self.view.bounds;
videoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.view.layer addSublayer:videoLayer];
[self.avPlayer play];
5.订阅活动 - 视频确实播放到最后
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:[self.avPlayer currentItem]];
6.相关方法从一开始就恢复视频播放
- (void)itemDidFinishPlaying:(NSNotification *)notification
AVPlayerItem *player = [notification object];
[player seekToTime:kCMTimeZero];
【讨论】:
视频再次开始播放时会有毫秒的间隔。如何解决这个问题? @ShanuSingh 我不知道该怎么做。可能是 seekToTime:kCMTimeZero 需要一些时间来执行。如果这有帮助,您可以尝试在开始和结束时准备具有相似帧的视频。 @ShanuSingh 你有没有找到解决视频重新开始播放时毫秒间隔的解决方案。 @YogendraPatel,不走运,我使用的是 gif 而不是 .mp4,但仍有非常小的重复视图。【参考方案2】:斯威夫特
在 Swift 中也是类似的。将视频添加到您的资源包。我更完整的答案是here。
import UIKit
import AVFoundation
class ViewController: UIViewController
var player: AVPlayer?
@IBOutlet weak var videoViewContainer: UIView!
override func viewDidLoad()
super.viewDidLoad()
initializeVideoPlayerWithVideo()
func initializeVideoPlayerWithVideo()
// get the path string for the video from assets
let videoString:String? = Bundle.main.path(forResource: "SampleVideo_360x240_1mb", ofType: "mp4")
guard let unwrappedVideoPath = videoString else return
// convert the path string to a url
let videoUrl = URL(fileURLWithPath: unwrappedVideoPath)
// initialize the video player with the url
self.player = AVPlayer(url: videoUrl)
// create a video layer for the player
let layer: AVPlayerLayer = AVPlayerLayer(player: player)
// make the layer the same size as the container view
layer.frame = videoViewContainer.bounds
// make the video fill the layer as much as possible while keeping its aspect size
layer.videoGravity = AVLayerVideoGravity.resizeAspectFill
// add the layer to the container view
videoViewContainer.layer.addSublayer(layer)
@IBAction func playVideoButtonTapped(_ sender: UIButton)
// play the video if the player is initialized
player?.play()
【讨论】:
以上是关于如何在没有控件的 UIView 中播放视频,如背景/壁纸?的主要内容,如果未能解决你的问题,请参考以下文章
winform中,播放一段全屏SWF视频,鼠标点击视频上一段区域 得到点击区域内的事件
h5中利用canvas绘制video 忽略浏览器自带视频播放控件
(更新版)Android VideoPlayer 在滚动列表实现item视频播放(ListView控件和RecyclerView)