Google Exoplayer 之全面认识

在设备上播放音频和视频已经很流行了,框架提供了用于播放媒体用最少的代码的快速解决方案 。也提供了low-level 的 api 用于构建定制媒体播放器的解决方案,例如,和 。
是建立在low-level api之上的 app级开源播放器 。开源项目包含 库和demo 。
本文介绍了库及其用途,使用的利弊 ,具体的代码示例演示了如何使用,展示了如何使用 播放 DASH,和 HLS 自适应流,如 MP4,M4A,FMP4,支持 WebM,MKV,MP3,OGG,WAV,MPEG-TS,MPEG-PS,FLV 和 ADTS( AAC) 。还讨论的事件、消息、定制和 对 DRM 的支持 。
1优点和缺点
相比内置的 ,具有许多优于优势:
需要注意的是,也有一些缺点,这一点很重要:
库的核心是接口 。接口暴露了传统的 high-level 播放器中的功能,如资源缓冲,播放,暂停和拖拽等 。接口的实现类对媒体的播放类型、存储位置和渲染方式做出假设,而不是笼统的加载和渲染 。把播放类型、存储位置和渲染方式等任务委派给不同的部件,然后在创建播放器或后台播放的时候把这些部件注入 。这些部件包括:
类库提供这些部件在通常情况下的默认实现,下面有详细描述 。一个可以利用这些部件 。如果标准实现不能满足需求,也可以使用自定义实现 。例如,自定义 可以改变播放器的缓冲策略,或自定义 可实现本身不支持的视频编解码器 。
提供默认的音频和视频渲染器,利用了框架中的和类 。这两个都需要一个对象中注入,用来实现媒体示例的播放 。
组件的注入在当前库中是普遍存在的 。下图展示了使用一个来配置和播放MP4媒体流的高级对象模型 。默认的音频和视频渲染器已经被注解到中 。一个叫e类的实现被注解到渲染器中用于提供简单的媒体播放功能 。和示例被注解到e来支持加载媒体流和在被加载的数据中提取样板 。在这个示例中和被用于播放从URIs中导入的MP4流 。
注入的概念贯穿整个类库的实现,默认的部件实现类何以被进一步的委托注入,这让许多子部件被单独更换成自定义实现 。比如,通过提供一个定制的工厂有可能从一个非标准的源或通过不同的网络协议栈加载数据 。而默认的 实现需要一个或多个工厂的构造函数被注入 。
media
支持自适应流,即在播放的时候,根据网络状况自动调节视频质量 。DASH,和HLS展示了自适应流技术 。以上三种,媒体都是通过小块的方式加载(通常2到10秒的长度) 。每当一块媒体被请求,客户端将会选择一种可能的规格 。例如:如果网络情况比较好,客户端将选择高质量的规格,如果网络比较差则会低质量的 。在两种技术中,视频和音频都需要被分割 。
DASH
库通过支持DASH和动态播放,即通过读取独立的媒体块 。每个需要一个通过构造方法注入进来 。主要负责加载和读取样本来提供媒体块 。类使用FMP4和WebM容器格式来提供DASH播放 。类使用FMP4容器格式 。
两种类型的实例需要一个解析器和一个数据源通过构造的方式注入 。在每个块被加载之前选择一种可用的格式,提供数据源 。最终,需要一个对象去控制缓冲块 。
下图演示了DASH动态播放通常的配置 。通过实现视频质量的动态变化,但是音频的质量是固定的 。
开始使用需要执行以下步骤:
添加依赖
创建一个实例
将和 view (用于视频输出和用户输入)关联
调用方法,注入,准备播放

Google Exoplayer 之全面认识

文章插图
播放结束释放
这些步骤在下面更详细地所述 。对于一个完整的示例,请参阅 在演示程序 。