百思不得姐数据挖掘第三篇

播放视频的界面现在只剩下视频的功能了,对于这种播放视频的应该属于功能块。我们可以单独把这个功能提取出来。

我们新建一个包Plugins专门放置各种功能,我称作为插件。因为要封装的功能是被其他人一键调用,别人无需知道实现,只要知道接口即可,在其他人眼中也就是Manger功能。

我们在Plugins包里面新建一个Video的包。

对于播放视频的功能只在2013年做过,貌似叫做MP开头的类,差不多忘记了。我们可以谷歌一下,不怕不会,只怕不会搜索。

我们轻松的搜到播放视频需要这个类MPMoviePlayerController,我们导入试一下。

import MediaPlayer

我们新建一个类VideoPlugin先做一个叫做playVideo方法试一下是否能播放。

func playVideo() {
        let videoFile = Bundle.main.path(forResource: "app_splash_movie", ofType: "mp4")
        assert((videoFile != nil),"视频地址不能为空!")
        let videoUrl = URL(fileURLWithPath:videoFile!)
        let videoPlay = MPMoviePlayerViewController(contentURL: videoUrl)
    }

当我去查看怎么播放时候,发现MPMoviePlayerViewController已经在iOS9之后过时。系统提示用Use AVPlayerViewController in AVKit.

既然MPMoviePlayerViewController这个类已经过时了,我们就导入AVKit使用最新的类AVPlayerViewController如果这个类是9.0之后出的,我们就做兼容模式,如果8.0就出现了,我们就可以直接使用最新的,因为我们是从iOS8.0开始的。

@available(iOS 8.0, *)
open class AVPlayerViewController : UIViewController {

果然和我们预想的一样,果然是兼容iOS8.0的。我们把代码改成下面的样子。

let videoPlay = AVPlayerViewController()

发现AVPlayerViewController已经不像MPMoviePlayerViewController这样的初始化,应该有其他的方法。

open var player: AVPlayer?

我们第一眼就看到这个属性,看名字很像。点进入发现类方法需要传入我们刚才的文件地址,并且有播放和暂停等功能。这个应该是我们所需要的。

let videoPlay = AVPlayer(url: videoUrl)
let videoPlayController = AVPlayerViewController()

我们需要放置在我们播放视频界面的模板上面,我们就写一个初始化方法让外部把父试图传进来。

init(contentView:UIView) {
        videoView = contentView
        super.init()
    }

再次修改我们的代码

func playVideo() {
        let videoFile = Bundle.main.path(forResource: "app_splash_movie", ofType: "mp4")
        assert((videoFile != nil),"视频地址不能为空!")
        let videoUrl = URL(fileURLWithPath:videoFile!)
        let videoPlay = AVPlayer(url: videoUrl)
        let videoPlayController = AVPlayerViewController()
        videoPlayController.view.frame = videoView.frame
        videoPlay.play()

    }

在我们的播放界面测试一下。

/// 进入页面自动播放视频
    func autoPlayVideo() {
        let videoPlay = VideoPlugin(contentView: videoView)
        videoPlay.playVideo()
    }

我们在viewDidLoad方法里面调用autoPlayVideo

发现并没有播放,原来是忘记addSubView了,犯了低级错了。

视频截图

黑乎乎的,应该界面是出来了,但是播放不了。

仔细的查看了代码,忘记给属性赋值。

open var player: AVPlayer?

我们赋值一下。再次试一下看看。

videoPlayController.player = videoPlay

播放的界面总算是出来了,但是点击按钮会崩溃,崩溃信息如下。

2016-11-07 10:57:13.541 BaiSiBuDeJie[14481:162524] 10:57:13.541 ERROR:     98: Error '!obj' trying to fetch default input device's sample rate
2016-11-07 10:57:13.541 BaiSiBuDeJie[14481:162524] 10:57:13.541 ERROR:     100: Error getting audio input device sample rate: '!obj'
2016-11-07 10:57:13.541 BaiSiBuDeJie[14481:162524] 10:57:13.541 WARNING:   230: The input device is 0x0; '(null)'
2016-11-07 10:57:13.541 BaiSiBuDeJie[14481:162524] 10:57:13.541 WARNING:   234: The output device is 0x27; 'AppleHDAEngineOutput:1B,0,1,2:0'
2016-11-07 10:57:13.542 BaiSiBuDeJie[14481:162524] 10:57:13.542 ERROR:     296: error '!obj'
2016-11-07 10:57:13.542 BaiSiBuDeJie[14481:162524] 10:57:13.542 ERROR:     113: * * * NULL AQIONode object
2016-11-07 10:57:13.542 BaiSiBuDeJie[14481:162344] 10:57:13.542 ERROR:     296: error -66680
2016-11-07 10:57:13.542 BaiSiBuDeJie[14481:162524] 10:57:13.542 ERROR:     703: Can't make UISound Renderer
2016-11-07 10:57:13.542 BaiSiBuDeJie[14481:162344] 10:57:13.542 ERROR:     296: error -66680
2016-11-07 10:57:13.543 BaiSiBuDeJie[14481:162344] 10:57:13.542 ERROR:     296: error -66680
2016-11-07 10:57:13.543 BaiSiBuDeJie[14481:162344] 10:57:13.543 ERROR:     296: error -66680

这错误信息看得我一头雾水,我们搜一下错误码试一下。

谷歌的意思,iOS模拟器要使用输入设备和输出设备,但是Mac电脑没有,会造成这样的结果。因为AVPlayer造成这些错误的信息。

再次从AVPlayer找到一个叫做Error的属性,输入一下看看有什么错误的信息。然并卵,这个属性为nil,看来我们初始化也没有什么问题。

我们测试一下真机,看看问题是否解决。

经过测试视频可以正常的播放,但是一直悬浮功能栏,我们看看能不能去掉,有什么属性没有。

open var showsPlaybackControls: Bool

这个属性有点像,而且属性的默认值是true,我们设置false试一下。

经过测试也是可以的,界面看着有点丑 我们把按钮距离底部约束为40,删除之前的上约束。

这是最后的界面。

对应的工程文件下载下载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jaycekon

Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)

概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容。主要是对电脑笔记本以及他们的属性进行抓取,然后在使...

4325
来自专栏程序员的SOD蜜

“老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春

火热的MVVM框架 最近几年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能的框架成为耀...

4086
来自专栏流媒体人生

内嵌Activex的Activex插件开发

介绍:   如今在许多流媒体视频网站(youku,tudou......)我们都会发现,观看视频之前都会有一段时间的广告,甚至在观看视频途中也会插入一些 广...

933
来自专栏有趣的django

博客园美化终极版-(自定义导航栏)----什么CSDN、简书、腾讯云专栏、个人博客和微信公众号都弱爆了

7030
来自专栏QQ音乐技术团队的专栏

一个循环动画引起的内存泄露问题总结

本文主要记录项目中遇到的一个内存泄露问题:由于一个循环动画引起的内存泄露,并且这个问题也是偶现的,在后面的隐藏问题里会说明。

4292
来自专栏张善友的专栏

在OpenOffice.org和微软Office之间共享文档

原文:Sharing files between OpenOffice.org and Microsoft Office。翻译可能也比较随意。 本文版权请向原文...

2097
来自专栏iOSDevLog

更多关于CocoaScript目录

3796
来自专栏冰霜之地

WWDC2016 Session笔记 - Xcode 8 Auto Layout新特性

Incrementally Adopting Auto Layout是什么意思呢?在我们IB里面布局我们的View的时候,我们并不需要一次性就添加好所有的con...

883
来自专栏向治洪

iOS开发入门笔记

iOS开发入门笔记 本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的iOS开发初学者,初衷在于让我的同事一小时内了解如何开始开发i...

4336
来自专栏pangguoming

c#以POST方式模拟提交表单

这是我一年前写的一个用C#模拟以POST方式提交表单的代码,现在记录在下面,以免忘记咯。那时候刚学C#~忽忽。。很生疏。。代码看上去也很幼稚 臃肿不堪 #reg...

3339

扫码关注云+社区

领取腾讯云代金券