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

*写在前面

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

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

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

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

1、创建

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

创建方法

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

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

监听AVPlayItem 的 status
监听的实现方法

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

播放结束后的通知

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

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

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

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

AVLayerVideoGravityResizeAspectFill视频示例1

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

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

videoGravity的三个属性值

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

AVLayerVideoGravityResize视频示例2

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

视频示例3

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

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

支持外放

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容