前言

在高仿网易新闻遇到视频播放的问题,以前很少做多媒体这一块,我一向的逻辑就是想弄清楚就从零开始写。所以出于学习的目的,自己又制造了一个轮子。项目地址WLVideoPlayer-MP-,花很大的心思加强复用性。具体效果如下。


准备

为了方便新同学学习多媒体视频播放的相关内容,已经把每一个步骤都打包成一个单独的工程


当然,你也完全可以从Github上clone整个项目。

WLVideoPlayer的使用

 playingPlayerView = WLVideoPlayerView(url: NSURL(string: urlStr)!) playingPlayerView?.customControlView = controlView //你需要的控制面板 playingPlayerView?.placeholderView = UIImageView(image: UIImage(named: "placeholder")) // 视频加载时的等待图片 playingPlayerView?.playInView(inView) // 播放

WLVideoPlayer提供了默认的视频控制面板,如果你想使用自己的,只需要继承自WLBasePlayerControlView并根据WLPlayerControlViewDelegate协议调用你想实现功能的相应代理方法即可。你所做的只有布局你的自定义控制面板。

功能分析

苹果提供的MPMoviePlayerController功能已经很完善了,那为什么还要要自定义视频播放器?弄清这一点,我们才能知道我们自定义视频播放器的的目的。

  • 最直接的无非就是控制面板的问题,视频控制面板太丑,上面很多控件是用不着的。
  • 支持的播放格式少

而又因为播放格式的问题涉及到视频文件的解码,这个对于不是学习视频算法的我们太过于牵强(虽然有VLC)。所以我们自定义视频播放器的的任务已经很明显了。

  • 能支持自定义视频控制面板
  • 视频播放\停止\拖拽快进等基本功能
  • 视频全屏与屏幕旋转问题的解决

其中我认为最重要的便是能支持自定义视频控制面板,它决定了你的这个小播放器能不能重复使用

代码简析


这是播放器主体代码,其他的部分都是测试用的数据源,是从作者另外一个开源项目高仿网易新闻中分离出来。具体实现不需要太过于关心。因为代码中加了大量的注释,所以只简单介绍一下重要的一些代码片段。

WLVideoPlayerView.swift

外接都是通过直接操作这个类来控制视频播放器的行为。

 var contentURL: NSURL? var placeholderView: UIView? /// 用户自定义控制界面 var customControlView: WLBasePlayerControlView? /// 用户自定义视频控制面板自动隐藏的时间 var customControlViewAutoHiddenInterval: NSTimeInterval /// 进入全屏的模式 var fullscreenModel: WLVideoPlayerViewFullscreenModel

这些都是暴露出来提供外部来设置播放器的一些属性,其中值得一提的便是customControlView这个的属性。这便是我们的视频控制器视图了,当初在设计的时候十分头疼,原本应该是这样,这个customControlView必须是UIView的子类,而且他也必须遵守我设置的一系列协议规范。但是很可惜我没有发现swift中有类似于oc这样的写法

UIView<someProtocol> *customControlView

于是我在妥协之下,只能使用继承这种不太优雅的方式解决。设计了一个类似于抽象类的WLBasePlayerControlView

接下来是一堆私有属性,其中需要主要的是

lazy var playerControlHandler: WLPlayerHandler = WLPlayerHandler()

这个对象的功能是处理视频控制器的事件,比如暂停、快进、全屏等事件。设计这样一个对象的目的是为了将视频控制器的事件于播放事件进行分离,减少WLVideoPlayerView.swift的代码量。

然后值得一提的便是几个全屏\旋转的控制方法

func toLandscape(angle: CGFloat) func toPortrait() func enterFullscreen func exitFullscreen() func changePlayerScreenState

因为iPhone手机应用一般都会禁止项目的旋转,一般只会支持Portrait这一个方向,然而我们往往是希望当手机横屏播放视频的时候,视频内容能够铺满全屏。在这样的需求下,系统自带的setFullscreen方法是不好使的。所以只能自己实现放大、缩小、旋转的方法。当发生全屏、退出全屏、旋转等事件时,对播放器视图、控制面板视图进行处理。因为视频控制面板又是用户自定义的,几乎都是使用autolayout进行布局,所以在必须更新相应的约束。

WLPlayerHandler.swift

这个文件主要是WLPlayerHandler类的实现,之间也解释了,WLPlayerHandler是为了将视频控制面板的逻辑与视频播放本身逻辑进行分离而设计的一个类。WLPlayerHandler主要处理用户自定义控制面板的一些事件,比如:暂停按钮点击、全屏按钮的点击、进度条拖拽等

 weak var player: MPMoviePlayerController! weak var customControlView: WLBasePlayerControlView!

这里使用weak关键字是为了防止WLVideoPlayerView的实例对象与WLPlayerHandler实例对象造成循环引用。

WLBasePlayerControlView.swift

这个文件里面定义了WLPlayerControlViewDelegate代理协议与WLBasePlayerControlView类,这样是妥协的设计办法,暂时因为作者能力有限没找到更加优雅实现方式。WLBasePlayerControlView类是所有自定义视频控制面板的基类,如果想实现你自己的播放面板,你得继承自这个类,并通过delegate属性调用WLPlayerControlViewDelegate协议提供的方法来处理你面板上的事件。

PlayerControlView.swift和PlayerDemoControlView.swift

这两个文件是提供给大家参考的视频控制面板的实现方式,PlayerControlView是用xib进行布局,而PlayerDemoControlView.swift是使用SnapKit进行布局。参照这两个的实现方式,完全可以自定义你专属的视频控制面板。

PlayerControlViewAuxiliary.swift

这里面定义的是UpdateProgressprotocol协议以及提供的默认实现,也是提供给自定义视频控制面板使用的

总结

在实现WLVideoPlayer这个轮子的过程中,发现如果不涉及对视频的解码,自定义一个播放器的过程也就是自定义它的视频控制面板的过程。而对于视频播放的逻辑处理(如快进、全屏等)各个播放器基本都是一样的。不同的仅仅在于视频控制面板的样式不同。正因为这一特征,我才将视频控制面板逻辑处理与视图布局分离。这样,我只需要写一次通用的逻辑处理方式,以后再根据不同的需求设计不同控制面板即可。这样这个轮子造的才有意义。如果你是新手,您根据我开发工程的步骤,对代码重构的过程,应该会有理解。如果您有更好的建议或者意见,欢迎您的指出。

后续工作

这个轮子已经具备的一个简单播放器的基本功能,但任然有很多的功能可以添加,日后将不断对这个项目进行完善、对代码质量进行提高。不过MPMoviePlayerController这个类苹果已经不建议我们使用了,所以以后应该还会使用AVPlayer开发一个类似的播放器。最后再次附上本项目地址WLVideoPlayer-MP-



文/疯狂的剁椒鱼头(简书作者) 原文链接:http://www.jianshu.com/p/035be0175b55 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

swift:基于MPMoviePlayerController的视频播放器的更多相关文章

  1. HTML5 播放 RTSP 视频的实例代码

    目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 HTML 并不标准支持 RTSP 流。本文重点给大家介绍HTML5 播放 RTSP 视频的实例代码,需要的朋友参考下吧

  2. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 详解如何通过H5(浏览器/WebView/其他)唤起本地app

    这篇文章主要介绍了详解如何通过H5(浏览器/WebView/其他)唤起本地app的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. AmazeUI 折叠面板的实现代码

    这篇文章主要介绍了AmazeUI 折叠面板的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码

    这篇文章主要介绍了HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  7. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. html5唤起app的方法

    这篇文章主要介绍了html5唤起app的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. HTML5拍照和摄像机功能实战详解

    这篇文章主要介绍了HTML5拍照和摄像机功能实战详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部