美文网首页iOS TipsiOS开发笔记iOS点点滴滴
升级iOS10后,AVPlayer有时候播放不了的问题

升级iOS10后,AVPlayer有时候播放不了的问题

作者: 景天儿 | 来源:发表于2016-09-28 14:59 被阅读12258次

如果你的视频使用的是HLS(m3u8)协议的,是不会由于升级ios10出现这个播放问题的。

如果不是基于HLS协议的,解决方法如下

self.player = [AVPlayer playerWithPlayerItem:self.playerItem];
//        [self.player replaceCurrentItemWithPlayerItem:self.playerItem];
if([[UIDevice currentDevice] systemVersion].intValue>=10){
//      增加下面这行可以解决iOS10兼容性问题了
      self.player.automaticallyWaitsToMinimizeStalling = NO;
}

ios10种AVPlayer增加了多个属性,其中有几个需要注意一下

  1. timeControlStatus
  2. automaticallyWaitsToMinimizeStalling
    正是第二个属性的默认值导致了不使用HLS的方式(比如使用localhttpserver间接实现在线播放、或者下载到本地再播放的方式)就会播放不了的问题。

重点就在上述第二条的官网文档的这段描述

Important

For clients linked against iOS 10.0 and later or macOS 10.12 and later (and running on those versions), the default value of this property is true. This property did not exist in previous OS versions and the observed behavior was dependent on the type of media played:

* HTTP Live Streaming (HLS): When playing HLS media, the player behaved as if automaticallyWaitsToMinimizeStalling is true.

* File-based Media: When playing file-based media, including progressively downloaded content, the player behaved as if automaticallyWaitsToMinimizeStalling is false.

You should verify that your playback applications perform as expected using this new default automatic waiting behavior.

在之前的版本中,我们通过rate来判断avplayer是否处于播放中

- (Boolean)isPlaying
{
    return self.player.rate==1;
}

在iOS10中,AVPlayer多了一个timeControlStatus,我们就应该这么实现

- (Boolean)isPlaying
{
    if([[UIDevice currentDevice] systemVersion].intValue>=10){
        return self.player.timeControlStatus == AVPlayerTimeControlStatusPlaying;
    }else{
        return self.player.rate==1;
    }
}

当时的具体问题是这样的,我们的场景是有声绘本,在翻页时使用了seek来设定起始时间。在调用了[self.player play]方法之后播放器并没有播放(此时loadedTimeRanges已经足以播放了) self.player.timeControlStatus 是wait状态。
这时候其实可以通过另外一个iOS10新增加的属性reasonForWaitingToPlay来查看wait的原因。

总的来说,如果在不使用HLS的情况下,AVPlayer新增加的属性可以比较好的反应实际播放中的一些状态,而无需我们自己去维护状态了。

我们问题解决了。如果你的问题还没有解决可以再看下这篇WWDC的文章,Advances in AVFoundation Playback

相关文章

网友评论

  • 不管you多苦:AVplayer播放不了wmv格式的视频,网上说支持wmv的
  • bu忘粗心:博主 有遇到部分设备 画面卡在第一祯的情况吗
    bu忘粗心:@James_007 还没有
    YLAS007:我也遇到了,请问解决了吗?有一点的几率会卡住
    hhhhhhhhhh1655:我这儿遇到了,请问你是怎样解决的?
  • 低调的魅力:ipv6下无法播放视频是咋回事儿啊?
    低调的魅力:@景天儿 应该是
    景天儿:没有在ipv6下运行过,v4下如果运行正常,那应该是网络层面的问题了吧
  • wycandyy:楼主 加上去这句话 本地视频 还不不管用啊
    Mio_黄苗炜:我发现在10的系统下,播放本地十几秒的视频的时候,暂定播放,然后在点击home键进入后台,再回到前台,会发现界面闪屏了一下。
    wycandyy:@景天儿 iOS9可以播放,iOS10 有时候 就是播放不了 也是偶现,播放不了的时候 发现相册的视频也播放不了
    景天儿:@wycandyy 那可能不是ios10的问题了,试试ios9下能不能播放?
  • _晨跑:有没有遇到kvo崩溃的问题,我播放器中是成对出现,add and remove ,但是bug收集上来的总是由于kvo问题产生了崩溃。
    _晨跑:@景天儿 多谢指点!
    景天儿:你可以尝试在add和remove上打log,传到服务器,然后看下是不是真的成对出现
  • 7f4bbad5097f:非常感谢您的分享,帮了我大忙。 :+1:
    景天儿::)
  • zidon:你好 用这个做视频 slider跳动问题遇到过吗
    zidon:@zidon 滑动后会先跳回去原来位置缓冲好才是真正seek的位置
    景天儿:@zidon 没有遇到slider跳动的问题
  • 人间一流:添加了那段代码还是没有用啊
    景天儿:是不是有其他问题,我们添加这行后就可以了
  • 一悸木槿伤:新手不太懂,我为什么加不上这段代码啊,是要升级Xcode么
    一悸木槿伤:@心有魍魉 哦 好的 谢谢 就说怎么敲不出来
    人间一流:@一悸木槿伤 这是iOS10新增的API,你需要使用xcode8.0以上版本
  • 9937c2c273f8:楼主我也碰到这个问题了,请问你是怎么解决的?
    景天儿:@转角就尿尿 那这样看,可能你的问题不是ios10的问题。可能你需要先确认一下是不是只有ios10有这个问题,然后如果没有加密的话,把连接直接放到浏览器里看可不可以播放?确认下问题出在哪里,然后再google百度stackoverflow一下了。
    9937c2c273f8: @景天 这句话我加上了,现在的情况是没有图像
    景天儿:@转角就尿尿 就是第一个代码块里面的,判断一下ios系统版本,如果是10或之后,就加上self.player.automaticallyWaitsToMinimizeStalling = NO;就可以了。
  • xueminglei:hls协议播放几秒后就不播放了,是什么原因,请教一下
    拉风的胖鱼:我也出现了这样的问题,不过是偶尔出现这种情况……请问下你的问题解决了没?
    daedb9fda9ae:@xueminglei hi 我也遇到一样的情况 hls在ios 10只能播放1-2s, 你解决了吗
    景天儿:@xueminglei 可以确定你的问题只在ios10上出现吗?
    我们只有视频部分用的hls协议,ios10上没有出现问题……
    只有早先没有用hls协议的音频部分,出问题了。

本文标题:升级iOS10后,AVPlayer有时候播放不了的问题

本文链接:https://www.haomeiwen.com/subject/opnhyttx.html