【iOS开发细节】之-用AVPlayer播放视频

*写在前面

在公司上次的小版本迭代中,因为我们现在的项目是奢侈品买卖的平台,所以产品经理要求加入现在绝大多数购物平台中详情页的视频展示功能,所以在几番查找资料中,完成了这个需求,现在将中间遇到的坑分享给大家,希望能帮助有需要的人!

iOS在播放视频方面其实提供了好多的方法:
1、iOS9.0 之前
使用 MPMoviePlayerController, 或者内部自带一个 view 的MPMoviePlayerViewController
2、iOS9.0之后
可以使用AVPictureInPictureController、AVPlayerViewController 或者 WKWebView

这些方式是苹果高度封装的,播放的样式都是苹果原生的,定制功能极少,使用方法很简单,直接创建,给URL就可以播放,支持本地视频和网络视频。

AVPlayer是比较底层的,可以高度定制UI的播放器,比如你想要不一样的播放界面,不一样的快进、播放、快退等按钮和功能,你就需要用到AVPlayer了,下面我给出AVPlayer的简单实用方法,更高深的定制功能,在以后有时间的时候会再发一篇文章做专门描述。

1、创建

在开始之前我们需要引入两个系统库
[#import
#import
创建方法init或playerItemWithURL或者 initWithURL:在使用 AVPlayer 播放视频时,提供视频信息的是 AVPlayerItem,一个 AVPlayerItem 对应着一个URL视频资源。但是在创建AVPlayerItem的时候AVPlayerItem需要传入一个AVAsset用来加载URL,具体创建代码如下:

【iOS开发细节】之-用AVPlayer播放视频_第1张图片
创建方法

在开始加载视频地址的时候我判断了一下是本地的视频还是网路视频,因为我们有本地的视频也有网络的事情需要用这个播放器播放
使用AVPlayer 的时候,一定要注意 AVPlayer 、 AVPlayerLayer 和 AVPlayerItem 三者之间的关系。 AVPlayer 负责控制播放, layer 显示播放,item 提供数据,当前播放时间, 已加载情况。 Item 中一些基本的属性, status, duration, loadedTimeRanges, currentTime(当前播放时间)。

初始化一个 AVPlayItem 对象后,其属性并不是马上就可以使用。我们必须确保 AVPlayItem 已经被加载好了,可以播放了,才能使用。 毕竟凡是和网络扯上关系的都需要时间去加载。 所以我们需要监听目前播放的状态,用KVO进行监听 AVPlayItem 的 status

监听AVPlayItem 的 status
【iOS开发细节】之-用AVPlayer播放视频_第2张图片
监听的实现方法

如果你想在自动播放结束后做些事情,那我们需要添加一个通知

播放结束后的通知

在通知的实现方法里面做你想要做的事情,比如退出当前页面,或者更改一些状态什么的!

*下面讲一些我在做的时候遇到的一个坑

注意:我没有给视频加控制条,因为我们的需求只是播放短视频,并不需要控制暂停、播放、快进、快退和展示时间!

在我做的时候一个问题一直困扰着我,视频点开播放的时候视频总是不能够自适应屏幕我刚开始的时候出来的效果是这样的

【iOS开发细节】之-用AVPlayer播放视频_第3张图片
AVLayerVideoGravityResizeAspectFill视频示例1

整个视频是以高为最大边,横向拉伸的,所以可以看出来屏幕两边都已经超出了屏幕的显示范围

我起初就知道这肯定是由某个枚举控制的值来控制拉伸的,但是不知道是AVPlayer、AVPlayItem还是AVPlayerLayer的某个枚举值,找了很久,一直没找到,我就先搁置了,直到项目要上线的时候,其他东西都写完了,我觉得这个东西必须得搞一下的时候,我又重新看了一下我写过的代码,让我不小心看到了一个属性:videoGravity,这个属性是AVPlayerLayer,让我找的好苦,它有三个值分别是:

【iOS开发细节】之-用AVPlayer播放视频_第4张图片
videoGravity的三个属性值

在我一一试过之后,我觉得柳暗花明,内心无比的痛快,每每解决一个bug的时候内心都是这种感觉,原来我刚开始的时候就有设置这个值,只不过我设置成了AVLayerVideoGravityResizeAspectFill,所以它是满屏显示的,然后我调成了其他的值AVLayerVideoGravityResize 、然后它的显示效果是这样的

【iOS开发细节】之-用AVPlayer播放视频_第5张图片
AVLayerVideoGravityResize视频示例2

其实它也是满屏显示的,只不过纵向做了压缩,搞的本来是横向的视频被压缩的竖向显示了,然后我换了最后一种方AVLayerVideoGravityResizeAspect

【iOS开发细节】之-用AVPlayer播放视频_第6张图片
视频示例3

这样设置以后,视频终于正常显示了,显示不到的地方都是黑色的,视频也没有被拉伸,显示的这个问题已经完美的被解决了,其实不设置的话默认的值就是这个AVLayerVideoGravityResizeAspect,但是我都不知道我怎么设置上的,我也是醉了!

还有一点,也不能算叫做坑,是一个不足吧,有些朋友在这样做以后,发现视频可以播放了,但是没有声音,这里我们需要加入一行代码,来支持外放

支持外放

最后:我给大家的讲解,一般都是没有直接上代码的,都是截图,因为我想要大家自己敲出来,不想大家直接复制粘贴,这样可以加深对代码的映像(我会告诉你,因为我觉得这样比较好看么[捂眼笑])

你可能感兴趣的:(【iOS开发细节】之-用AVPlayer播放视频)