如何在没有控件的 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/… 据我所知,MPMoviePlayerControllerios 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 中播放视频,如背景/壁纸?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 iOS HTML5 视频控件? [关闭]

winform中,播放一段全屏SWF视频,鼠标点击视频上一段区域 得到点击区域内的事件

h5中利用canvas绘制video 忽略浏览器自带视频播放控件

(更新版)Android VideoPlayer 在滚动列表实现item视频播放(ListView控件和RecyclerView)

Swift - 如何根据视频播放器框架的大小动态调整 UIView 的大小

关于WPF中Image控件不释放内存的问题