
播放视频跟音乐是安卓设备上常用的功能,android库的MediaPlayer提供可以使用少量代码解决的方案,它也提供低级媒体APIs像MediaCodec、AudioTrack和MediaDrm来自定义媒体播放器。
ExoPlayer是一个开源的,基于安卓低级媒体APIs的应用程序级别的媒体播放器。这个开源项目包涵两个别:
本手册介绍了ExoPlayer库及其功能,提供详细的样例。 涉及使用ExoPlayer的优缺点。 它展现了怎样使用ExoPlayer播放DASH,SmoothStreaming和HLS自适应流,以及如MP4,M4A,FMP4,WebM,MKV,MP3,Ogg,WAV,MPEG-TS,MPEG-PS,FLV和ADTSAAC)。 它还讨论了ExoPlayer事件,消息,定制和DRM支持。
ExoPlayer 相比安卓中的MediaPlayer有很多的优点:
注意它也是一些特点:
ExoPlayer库的核心是ExoPlayer的接口,其中定义了包涵传统播放器的功能,例如缓冲媒体、播放、暂停、定位等。ExoPlayer没有设定可以播放的媒体种类、存储的方法跟位置或者渲染的方法,也没有直接推动加载和播放媒体。而是在播放器被创建以及打算播放时将这种工作代理给注入其中的模块来推动,常见的ExoPlayer组件实现是:
这个库提供了常用模块的使用,但也可以实现自定义的谋求。例如,可以注入自定义的LoadControl来修改播放器的缓冲策略,或者注入自定义的渲染器(Renderer)来使用Android不支持的视频编码器。注入组件的概念是推动播放器功能的模块化,可以支持只是添加个别组件最可开启播放器,而默认提供的细则是前面提出的几点。例如,默认的MediaSource实现要求使用构造方法提供一个或多个DataSource。但是通过自定义工厂可以提供从不非标准或不同的网络上加载数据。
简单的使用ExoPlayer包涵以下方法:
这些方法将在以下最详尽地评述。 有关完整的样例,请参看ExoPlayer演示程序中的PlayerActivity。
第一步确认你的的build.gradle文件包涵JCenter和Google库。
repositories {
jcenter()
google()
}

然后添加gradle编译依赖到build.gradle文件中,下面的将要添加ExoPlayer库的所有依赖:
compile 'com.google.android.exoplayer:exoplayer:r2.X.X'
r2.x.x指的是版本号。或者可以只是依赖自己必须的库。例如以下只是依赖了Core,DASH和UI模块:
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'
所有可以使用的库模块包涵在以下的列表中:
除了那些库,ExoPlayer还提供扩充库的用途,详情可以浏览 extensions directory。
可以使用ExoPlayerFactory创建ExoPlayer实例。大多数的画面是使用ExoPlayerFactory.newSimpleInstance方法创建,这个方式会返回SimpleExoPlayer,它继承自ExoPlayer并提供了高级播放器的功能。代码示例如下:
// 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);
ExoPlayer库提供一个SimpleExoPlayerView,它封装了播放视频的播放控制视图和视频渲染界面,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元数据输出。

在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方法可以用于在媒体中查找,setRepeatMode可用于控制是否或者怎么循环,并且可以使用setPlaybackParameters来调整播放速度跟音量。
如果播放器绑定到SimpleExoPlayerView或PlaybackControlView,则客户与那些组件的交互将造成播放器上的相应方式被调用。
重要的是在不再需要时释放播放器,以传递有限的资源,如视频供其它应用使用。 这可以借助调用ExoPlayer.release来完成。
在ExoPlayer中,每个媒体都由MediaSource表示。 ExoPlayer库为DASH(DashMediaSource),SmoothStreaming(SsMediaSource),HLS(HlsMediaSource)和常规媒体文件(ExtractorMediaSource)提供MediaSource实现。在ExoPlayer演示程序中,可以在PlayerActivity中找到实例化的所有例子(四个)。
MediaSource实例被设计为不能重复使用。如果你想用相同的媒体打算一个播放器多次,那么经常都应使用一个新的示例。
除了上述的MediaSource实现之外,ExoPlayer库还提供了MergingMediaSource,LoopingMediaSource,ConcatenatingMediaSource和DynamicConcatenatingMediaSource。这些MediaSource实现借助组合实现最复杂的播放用途。一些常用的用例如下所述。注意,虽然在视频播放的上下文中叙述了下面例子,但他们相同适用于仅音频播放,实也适用于任何支持的外媒类型的播放。
一个视频文件跟一个单独的字幕文件,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);
要无限期循环,通常最好使用ExoPlayer.setRepeatMode而不是LoopingMediaSource。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-134564-1.html
在维护国家主权的问题上