【转】iOS AVPlayer的那些坑

这次主要是总结和记录下视频播放遇到的坑,视频播放采用的是AVPlayer这个控件,语法大致如下:

一般说来,这里要监听AVPlayerItem的status属性:

如果是AVPlayerStatusFailed说明视频加载失败,这时可以通过self.player.error.description属性来找出具体的原因。 问题一:当status变为AVPlayerStatusReadyToPlay后,我们调用play方法真的就能保证视频正常播放吗?

众所周知,AVPlayer支持的视频、音频格式非常广泛,抛开那些无法正常编解码的情况,在某些情况下其可能就是无法正常播放。AVPlayer在进行播放时,会预先解码一些内容,而此时如果我们的App使用CPU过多,I/O读写过多时,有可能导致视频播放声/画不同步,这点尤其在iPhone4上面表现更为明显,用户反馈iOS9.3.2的系统上也很明显。而如果是发生在AVPlayer初始化解码视频的时候,有可能导致视频直接无法播放,这时,我们再调用play或者seekToTime:方法都无法正常播放。建议不要在CPU或者I/O很频繁的情况下使用AVPlayer,例如刚登录App加载各种数据的情况下,可以等App预热以后再使用。

问题二:当rate属性的值大于0后,真的就在播放视频了吗?

当然不是。当发生上面所讲的情况时,我打印了当前的rate情况,是大于0的,但是页面上显示的情况却还是什么也没有。有时候我们如果想要在视频一播放的时候去做一些事情,例如设置一下播放器的背景色,如果我们仅仅是监听这个rate可能无法100%保证有效,而如果我们真的要监听这种情况的话,有一个取巧的方法:

另外如果不需要监听播放进度的时候可以调下面的方法:

当我们切换到后台后,这时AVPlayer通常会自动暂停,当然如果设置了后台播放音频的话,是可以在后台继续播放声音的,正如苹果自己的WWDC这个App一样。这个功能在我的另一篇文章iOS AVPlayer之后台连续播放视频中解决了这个问题。

问题四:音频通道的抢占引起的无法播放视频问题

这个问题下周我会另开一篇博客专门讲述,今儿就此略过。

问题五:其它App播放声音打断

如果用户当时在后台听音乐,如QQ音乐,或者喜马拉雅这些App,这个时候播放视频后,其会被我们打断,当我们不再播放视频的时候,自然需要继续这些后台声音的播放。

首先,我们需要先向设备注册激活声音打断AudioSessionSetActive(YES);,当然我们也可以通过 [AVAudioSession sharedInstance].otherAudioPlaying;这个方法来判断还有没有其它业务的声音在播放。 当我们播放完视频后,需要恢复其它业务或App的声音,这时我们可以在退到后台的事件中调用如下方法:

问题六:在用户插入和拔出耳机时,导致视频暂停,解决方法如下

问题七:打电话等中断事件

小提示:如果不起作用,请检查退到后台事件中有什么其它的操作没。因为电话来时,会调用退到后台的事件。

问题七:内存泄露问题 当我们释放一个正在播放的视频时,需要先调用pause方法,如果由于某些原因,例如切前后台时,导致又调用了play方法,那么有可能会hold不住内存空间而导致内存泄漏。其实更靠谱的方法是,还要移除player加载的资源。

总的来说,AVPlayer能满足一般的需求,虽然坑不少。最后,再来安利一下我自己封装的LYAVPlayer,简单方便,支持cocoa pods,只需几行代码即可完成播放:

工程中 pod 'LYAVPlayer','~> 1.0.1'即可使用。有什么问题请Issues我。

Original: https://www.cnblogs.com/xuan52rock/p/15011504.html
Author: 神奇的旋风
Title: 【转】iOS AVPlayer的那些坑

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/554122/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 本地宿主机器显示Docker 容器中的图像(Docker容器可视化)

    我们在Docker容器中运行程序,有的时候需要显示容器中的图像,或在容器中运行一些图形界面的软件、调用摄像头等,而Docker采用的是命令行的工作模式,那么docker容器中的输出…

    技术杂谈 2023年7月11日
    085
  • Ansible学习笔记

    相关资料 使用总结 介绍 Ansible安装 Ansible配置文件和命令 配置文件概述 Ansible系列命令 Ansible命令使用 Ansible命令参数中的Host-pat…

    技术杂谈 2023年7月10日
    080
  • 设计一个回调要注意哪些事情

    设计一个回调要注意哪些事情 回调是我们在设计系统的时候经常会使用到的, A服务调用B服务, 但是如果B服务提供的是一个较长时间的、异步的接口, 那么我们就会想到使用一个回调, 让B…

    技术杂谈 2023年6月1日
    097
  • 官方文档:grep 命令

    2 Invoking grep The general synopsis of the grep command line is There can be zero or more…

    技术杂谈 2023年5月31日
    091
  • 《Hyperspectral Image Transformer Classification Networks》论文笔记

    1. SACP Module:SACP使用两个光谱自适应三维卷积层构建,如下图所示,其中包括两个分支:局部空间分支L和全局光谱分支G。局部空间分支旨在学习空间位置敏感的重要图,全局…

    技术杂谈 2023年6月21日
    0106
  • 使用CRD扩展Kubernetes API

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月25日
    062
  • Unity引用System.Drawing失败 reason: File does not contain a valid CIL image

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年5月31日
    083
  • 刘亦菲生日当天,引发了我对正则的思考

    前两天从网上采集到一条短视频数据(刷短视频),发现六公主连排5部刘亦菲主演的电影!甚是震惊,太有牌面了,看了一下日子是8月25号,嗷,原来当天是刘亦菲的生日。巧了,正好也是我家柴犬…

    技术杂谈 2023年7月25日
    094
  • 项目中所用到的mysql重复过滤

    问题:首先用户会本地上传一批号码(可能重复)到我们项目,通过解析文件,把号码入库(只验证是不是号码其他不做改动)到号码表,然后对号码进行去重操作. 表结构为:主键(id),号码(m…

    技术杂谈 2023年7月23日
    082
  • Vim使用技巧(持续更新)

    好记性不如烂笔头,在这里记录一些Vim使用技巧 vim配置 "拷贝同步&#…

    技术杂谈 2023年6月21日
    095
  • 【证券从业】金融基础知识-第四章 股票03

    注1:后续学习并整理到第八章,全书完结后再合并成一个笔记进行源文件分享 注2:本章内容巨多,大约分为三篇文章记录消化 posted @2022-06-08 01:28 陈景中 阅读…

    技术杂谈 2023年7月10日
    081
  • 学习链表复盘中

    链表基础知识 链表的分类 链表是一种通过指针串联在一起的线性结构,主要分为单链表、双向链表和循环链表。 单链表 单链表中每一个节点是由两部分组成,一个是数据域、一个是指针域(存放指…

    技术杂谈 2023年7月25日
    0100
  • Python 常用模块简析

    random.choices(population,weights=None,*,cum_weights=None,k=1):从指定序列中随机抽取k次数据,返回一个列表,可以设置权…

    技术杂谈 2023年6月21日
    083
  • Pycharm k火秘诀插件

    Pycharm2020最新永久激活码插件(支持Windows),100%永久激活 用到pycharm工具发现没用多久时间又过期了,在网上有看到很多朋友都遇到同样的情况,于是找到了一…

    技术杂谈 2023年6月21日
    0139
  • SpringSecurity之Oauth2介绍

    Oauth2认证的简单介绍 简介 第三方认证技术方案最主要是解决 认证协议的通用标准问题,因为要实现跨系统认证,各系统之间要遵循一定的接口协议。 OAUTH协议为用户资源的授权提供…

    技术杂谈 2023年7月11日
    065
  • Python实现简繁体转换,现在的人玩得老花了

    1、opencc-python 首先介绍opencc中的Python实现库,它具有安装简单,翻译准确,使用方便等优点。对于我们日常的需求完全能够胜任。 ; 1.1安装opencc-…

    技术杂谈 2023年6月21日
    093
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球