ExoPlayer用户手册

贴上原网址:https://google.github.io/ExoPlayer/guide.html

非完全翻译,有需要可以原网址自取,我发现网上也蛮多这个指导的翻译,可以去看看~

开始啦!:

    ExoPlayer是一个开源的应用级媒体播放器,构建在Android的低级媒体API之上。 开源项目包含ExoPlayer库和demo app:

  • ExoPlayer library – 包含项目的一些核心类库
  • Demo app – ExoPlayer的演示
本指南介绍了ExoPlayer库及其用途,介绍了使用ExoPlayer的优缺点(不翻,需要自查),以及如何使用ExoPlayer播放DASH、SmoothStreaming和HLS自适应流,还有ExoPlayer事件、消息、定制、DRM支持等。


1、library概述

ExoPlayer库的核心是ExoPlayer 界面。ExoPlayer实现不是直接实现加载和呈现媒体,而是将这项工作委托给创建播放器或播放准备时注入的组件。 所有ExoPlayer实现共同的组件有:

 

  • MediaSource:确定要播放的媒体,播放器从中读取要加载的媒体,MediaSource在播放开始时通过ExoPlayer.prepare注入。
  • Renderer:各种渲染器,播放器被创建的时候注入
  • TrackSelector:用于选择由MediaSource提供的轨道,以供每个可用渲染器使用。 当播放器创建时,TrackSelector将被注入。
  •  LoadControl:用于控制MediaSource缓冲更多媒体的时间,以及缓冲多少媒体。 在创建播放器时注入LoadControl。
 ExoPlayer可以使用这些组件,但如果需要非标准行为,也可以使用自定义实现来构建。 例如,可以注入自定义的LoadControl来更改播放器的缓冲策略,或者可以注入自定义渲染器来使用Android本身不支持的视频编解码器。

Getting started

对于简单的用例,ExoPlayer入门包括实现以下步骤:
1、添加ExoPlayer作为您的项目的依赖。
2、创建一个SimpleExoPlayer实例。
3、将播放器连接到视图(用于视频输出和用户输入)。
4、准备使用MediaSource播放的播放器。
5、完成后释放播放器。

Add ExoPlayer as a dependency

1、确保项目根目录中的build.gradle文件中包含jcenter库
repositories {jcenter()
}
2、添加一个gradle编译依赖关系到应用程序模块的build.gradle文件。 
compile 'com.google.android.exoplayer:exoplayer:r2.X.X'
3、以下内容将添加依赖于Core,DASH和UI库模块,这可能是播放DASH内容的应用程序所必需的:
compile 'com.google.android.exoplayer:exoplayer-core:r2.X.X'
compile 'com.google.android.exoplayer:exoplayer-dash:r2.X.X'
compile 'com.google.android.exoplayer:exoplayer-ui:r2.X.X'

Creating the player

我们可以使用ExoPlayerFactory创建一个ExoPlayer实例。 该工厂提供了一系列方法来创建具有不同级别的定制的ExoPlayer实例。 对于绝大多数用例,应该使用ExoPlayerFactory.newSimpleInstance方法之一。 这些方法返回SimpleExoPlayer,它扩展了ExoPlayer以添加额外的高级别播放器功能。 以下代码是创建SimpleExoPlayer的示例。
// 1. Create a default TrackSelector
Handler mainHandler = new Handler();
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector =new DefaultTrackSelector(videoTrackSelectionFactory);// 2. Create the player
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(context, trackSelector);

Attaching the player to a view

ExoPlayer库提供了一个SimpleExoPlayerView,它将一个PlaybackControlView和一个Surface放在哪个视频中。 SimpleExoPlayerView可以包含在应用程序的布局xml中。 将播放器绑定到视图:
// Bind the player to the view.
simpleExoPlayerView.setPlayer(player);
如果需要对播放器控件和渲染视频的Surface进行细粒度控制,则可以分别使用SimpleExoPlayer的setVideoSurfaceView,setVideoTextureView,setVideoSurfaceHolder和setVideoSurface方法直接设置播放器的目标SurfaceView,TextureView,SurfaceHolder或Surface。 可以使用PlaybackControlView作为独立组件,或实现与播放器直接交互的自己的播放控件。 setTextOutput和setId3Output可用于在播放过程中接收字幕和ID3元数据输出。

Preparing the player

在ExoPlayer中,每一块媒体均由MediaSource表示。 要播放一块媒体,必须先创建一个相应的MediaSource,然后将此对象传递给ExoPlayer.prepare。 ExoPlayer库为DASH(DashMediaSource),SmoothStreaming(SsMediaSource),HLS(HlsMediaSource)和常规媒体文件(ExtractorMediaSource)提供MediaSource实现。 以下代码显示如何使用适合播放MP4文件的MediaSource准备播放器。
// Measures bandwidth during playback. Can be null if not required.
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
// Produces DataSource instances through which media data is loaded.
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context,Util.getUserAgent(context, "yourApplicationName"), bandwidthMeter);
// Produces Extractor instances for parsing the media data.
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
// This is the MediaSource representing the media to be played.
MediaSource videoSource = new ExtractorMediaSource(mp4VideoUri,dataSourceFactory, extractorsFactory, null, null);
// Prepare the player with the source.
player.prepare(videoSource);
播放器准备好后,可以通过播放器上的方法来控制播放。 例如setPlayWhenReady可用于启动和暂停播放,并且可以使用各种seekTo方法在媒体内查找。 如果播放器被绑定到SimpleExoPlayerView或PlaybackControlView,则用户与这些组件的交互将导致播放器上的相应方法被调用。

Releasing the player

重要的是在不再需要时释放播放器,以释放有限的资源,如视频解码器供其他应用使用。 这可以通过调用ExoPlayer.release来完成。

MediaSource

在ExoPlayer中,每一块媒体均由MediaSource表示。 ExoPlayer库为DASH(DashMediaSource),SmoothStreaming(SsMediaSource),HLS(HlsMediaSource)和常规媒体文件(ExtractorMediaSource)提供MediaSource实现。 在ExoPlayer演示应用程序中,可以在PlayerActivity中找到实例化所有四个示例。

Side-loading a subtitle file

给出一个视频文件和一个单独的字幕文件,MergingMediaSource可以用于将它们合并到单个源中进行播放。
// Build the video MediaSource.
MediaSource videoSource = new ExtractorMediaSource(videoUri, ...);
// Build the subtitle MediaSource.
Format subtitleFormat = Format.createTextSampleFormat(id, // An identifier for the track. May be null.MimeTypes.APPLICATION_SUBRIP, // The mime type. Must be set correctly.selectionFlags, // Selection flags for the track.language); // The subtitle language. May be null.
MediaSource subtitleSource = new SingleSampleMediaSource(subtitleUri, dataSourceFactory, subtitleFormat, C.TIME_UNSET);
// Plays the video with the sideloaded subtitle.
MergingMediaSource mergedSource =new MergingMediaSource(videoSource, subtitleSource);


Seamlessly looping a video a fixed number of times

要无限循环,通常最好使用ExoPlayer.setRepeatMode而不是LoopingMediaSource。
使用LoopingMediaSource可以使视频无缝地固定多次。 以下示例播放视频两次。
MediaSource source = new ExtractorMediaSource(videoUri, ...);
// Plays the video twice.
LoopingMediaSource loopingSource = new LoopingMediaSource(source, 2);

Seamlessly playing a sequence of videos

ConcatenatingMediaSource可以连续播放两个或多个单独的MediaSource。 以下示例依次播放两个视频。 源之间的转换是无缝的。 没有要求连接的源具有相同的格式(例如,将包含480p H264的视频文件与包含720p VP9的视频文件连接在一起是很好的)。 源甚至可能是不同的类型(例如,将视频与仅音频流连接是很好的)。
MediaSource firstSource = new ExtractorMediaSource(firstVideoUri, ...);
MediaSource secondSource = new ExtractorMediaSource(secondVideoUri, ...);
// Plays the first video, then the second video.
ConcatenatingMediaSource concatenatedSource =new ConcatenatingMediaSource(firstSource, secondSource);

Advanced composition

(略)应避免在组合中多次使用相同的MediaSource实例,除非根据文档明确允许。  然而,一般来说,组合物形成的对象的图形应该是一棵树。 但是允许在组合中使用多个等效的MediaSource实例。

Player events

(略)

Sending messages to components

一些ExoPlayer组件允许在播放过程中更改配置。 按照惯例,我们可以通过使用sendMessages或blockingSendMessages方法将消息通过ExoPlayer传递到组件来进行这些更改。 这种方法确保了线程安全性,并且配置更改按照播放器上执行的任何其他操作顺序执行。

Customization

以下是构建自定义组件的一些用例:
1 渲染器:自定义渲染器来处理由库提供的默认实现不支持的媒体类型
2 TrackSelector :实现自定义TrackSelector允许应用程序开发人员更改MediaSource所公开的轨道被选中以供每个可用渲染器使用的方式。
3 LoadControl :实现自定义LoadControl允许应用程序开发人员更改播放器的缓冲策略。
4 Extractor : 如果需要支持库当前不支持的容器格式,请考虑实现自定义Extractor类,然后可以将其与ExtractorMediaSource一起使用以播放该类型的媒体。
5 MediaSource : 如果希望获取媒体样本以自定义方式提供给渲染器,或者您希望实现自定义MediaSource合成行为,则实现自定义MediaSource类可能适用。
6 DataSource :ExoPlayer的上游包已经包含了不同用例的一些DataSource实现。若希望实现自己的DataSource类,以其他方式加载数据,例如通过自定义协议,使用自定义HTTP堆栈或从自定义持久缓存加载数据。

Customization guidelines


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio查找功能(搜索功能)及快捷键

1、在当前窗口查找文本【CtrlF】 F3 向下查找关键字出现位置 ShiftF3 向上一个关键字出现位置 2、在当前工程内查找文本【CtrlShiftF】 先会弹出一个对话框,直接点击【find】,开始在整个工程内查找该字符串 查找结果如下: 3、查找类【C…

ZJU夏令营面试记录

首先记录一下这次夏令营面试。 1、进去后,圆桌会议,8个老师坐着。准备了6份简历简历表示不够,以后要多打几份。 2、首先,用英语介绍一下自己的专业(表示一脸懵逼) 3、说一下你这个暑假做了什么东西&…

Python的闭包

什么是闭包 #定义一个函数 def test(number): #在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包 def test_in(number_in): print("in test_in 函数, number_in is %d"%number_in) ret…

On the coexistence of transport protocols in data centers

论文信息:S. M. Irteza, A. Ahmed, S. Farrukh, B. N. Memon, and I. A. Qazi.On the coexistence of transport protocols in data centers. In Proceedings of IEEE ICC, 2014.数据中心传输协议的共存 摘要 云数据中心的出现直接导致了数据中心TCP(D…

Python中的特殊属性与方法

模块的特殊属性__doc__模块的说明文档__all__指明模块希望被使用的属性、类和方法__file__模块所在路径类的特殊属性__slots__限制类的实例允许添加的属性,是一个tuple元组类的特殊方法__new__(cls[, ...]) 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一…

如何做科研20171206

昨日听董大一席话,感触颇多,今日在此进行记录。(加粗字体为董大箴言) ① 关于看论文 董大问我你最近看了什么论文,我说,论文的题目没有记下来,只记得主要讲了什么。我以前一直以为一篇论文的阅…

contiki cooja仿真

最近在做contiki平台上的一些cooja仿真的东西,发现现在网上能学到的东西实在是很有限,现在在这里将我最近学到的一些东西做一下总结。 一、 关于运行的一般步骤: https://www.zhihu.com/question/48708549/answer/139050874 知乎上这个问…

MySQL指令笔记

-- 双中划线空格: 单行注释, 与#相同-- 链接数据库 mysql.exe -h localhost -P3306 -uroot -p-- 查看服务器的对外处理字符集 show variables like character_set%;-- 修改服务器认为的客户端数据的字符集为gbk;(单次访问有效) set character_set_client…

NS2:undefined reference to `xxx' collect2: error: ld returned 1 exit status

这个问题是没有链接。 刚开始先确认,头文件有没有导入。 以下是完整的提示信息错误,检查之后发现hdr_ant_pkt所在的头文件已经被导入;In function hdr_ant_pkt::access(Packet const*): cmu-trace.cc:(.text._ZN11hdr_ant_pkt6accessEPK6Pack…

6大设计原则之单一职责原则

单一职责原则 如果有一个用户管理类,类图如下 我想,任谁也能看的出这个接口设计的有问题,用户的属性和用户的行为没有分开,应该把用户的信息抽取成一个业务对象,把用户的行为抽取成一个业务对象,按照这个思路对类图进行修正,如下图所示 其实,在实际使用中我们更倾向于使用两个…

linux下Gnuplot的使用

压力是最好的老师。以前学不会Gnuplot只是因为不想学,

6大设计原则之里氏替换原则

面对对象中的继承 优点如下: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性提高代码的重用性子类可以形如父类,但又异于父类提高代码的可扩展性,很多开源框架的扩展接口都是通过继承父类来实现的提高产品或项目的开放性 缺点如下: 继承是侵入性的.只要继承,就…

scikit-learn安装

安装找到一个简书版本,讲的挺好的,先贴网址 https://www.jianshu.com/p/26ab6c22051e 但是在安装过程中,遇见了问题,现在贴一下: numpy_quaternion-2018.5.17-cp36-cp36m-win32.whl is not a supported wheel on this …

6大设计原则之依赖倒置原则

依赖倒置原则的定义 依赖倒置原则的原始定义如下: High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions. 翻译过来,包含如下三层…

论文写作——paper Note

论文的一些细节: 1)数字10以下一般用英文单词,10以上用阿拉伯字母; 2)公式最后要有标点,逗号(后面跟where。。。)或者句号; 3)figure的caption尽量多写一点内…

6大设计原则之接口隔离原则

接口隔离原则的定义 什么是接口. 实例接口,比如定义了一个Person类,然后 Person p new Pserson(); 产生一个实例,Person类就是 p 的接口类接口,就是Java中使用 interface 定义的接口 什么是隔离 隔离要求将接口尽量细化,同时接口中的方法尽量少. 接口隔离原则的实现 比如…

6大设计原则之迪米特法则

迪米特法则的定义 迪米特法则也称为最少知识原则,一个对象应该对其他对象有最少的了解. 通俗的讲,一个类应该对自己需要耦合或调用的类知道的最少,被调用类的内部是如何复杂都和我没关系,我就知道你的这些public方法,我就调用这么多,其他的我一概不关心. 迪米特法则对类的低耦…

论文写作——origin画图

一 origin的安装 详见下面网址,内涵下载路径和破解方法。 http://www.ddooo.com/softdown/51005.htm 1. 下载origin 网址:https://thepcgo.com/origin-pro-8-0-free-download/ 2.下载破解相关压缩包 链接:https://pan.baidu.com/s/1LwA…

论文写作——texstudio+texlive

一 安装 安装见下方链接 https://jingyan.baidu.com/article/63f236287febc50208ab3deb.html 二 使用 1、选择模板 IEEE: https://ieeeauthorcenter.ieee.org/create-your-ieee-article/use-authoring-tools-and-ieee-article-templates/ieee-article-templates/ ACM:…

6大设计原则之开闭原则

开闭原则的定义 开闭原则的定义: 一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭.即一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化. 软件实体包括一下部分 项目或软件产品中按照一定的逻辑规则划分的模块抽象和类方法 注意: 开闭原则对…