
撸了去年阿里、腾讯和携程的面试,我有一个重要发现.......>>
ExoPlayer是google开源的应用级媒体播放器项目,该开源项目包括ExoPlayer库和演示demo,github地址:。
ExoPlayer库的核心是ExoPlayer接口。ExoPlayer公开了传统的高水准媒体播放器的功能,例如媒体缓冲,播放exoplayer jar,暂停和快进功能。ExoPlayer没有直接推动媒体文件的加载和渲染,而是把这种工作委托帮了在组建播放器或者播放器准备好播放的之后注入的模块。所有ExoPlayer实现的通用模块是:
implementation 'com.google.android.exoplayer:exoplayer:2.X.X'
此种方式依赖了整个ExoPlayer库。我们也可以只依赖自己真正需要的库。例如若你应播放普通的媒体资源,你可以只依赖Coreexoplayer jar,UI这两个个库。
implementation 'com.google.android.exoplayer:exoplayer-core:2.X.X'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.X.X'

整个ExoPlayer库包括5个子库,依赖了整个ExoPlayer库和依赖5个子库是等效的。
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/exo_play_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
private PlayerView mPlayerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
[...]
mPlayerView = findViewById(R.id.exo_play_view);
}
// 得到默认合适的带宽
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
// 创建跟踪的工厂
TrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
// 创建跟踪器
DefaultTrackSelector trackSelection = new DefaultTrackSelector(factory);
// 创建播放器
SimpleExoPlayer exoPlayer = ExoPlayerFactory.newSimpleInstance(context, trackSelection);
// 第二种方式 传入了默认的渲染工厂(DefaultRenderersFactory),默认的轨道选择器(DefaultTrackSelector)和默认的加载控制器(DefaultLoadControl),然后把返回的播放器实例
//SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(
// new DefaultRenderersFactory(context),
// new DefaultTrackSelector(),
// new DefaultLoadControl());
// 生成数据媒体实例,通过该实例加载媒体数据
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "exoplayerdemo"));
// 创建资源
Uri uri = Uri.parse(url);
MediaSource mediaSources = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
// 将播放器附加到view
mPlayerView.setPlayer(exoPlayer);
// 准备播放
exoPlayer.prepare(mediaSource);
// 准备好了之后自动播放,如果已经准备好了,调用该方法实现暂停、开始功能
exoPlayer.setPlayWhenReady(true); if (null != exoPlayer) {
exoPlayer.stop();
exoPlayer.release();
exoPlayer = null;
}
ExoPlayer库提供了ConcatenatingMediaSource和DynamicConcatenatingMediaSource可以用来无缝的合并播放多个媒体资源。

使用ConcatenatingMediaSource
下面的方式形成了组合的外媒文件。
/**
* list是资源地址集合,可以是音频、视频等
*/
private MediaSource getMediaSource(ArrayList<String> list) {
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "exoplayerdemo"));
// 将URL组装成资源类
MediaSource[] mediaSources = new MediaSource[list.size()];
for (int i = 0; i < list.size(); i++) {
Uri uri = Uri.parse(list.get(i));
mediaSources[i] = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
}
MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0] : new ConcatenatingMediaSource(mediaSources);
return mediaSource;
}
ExoPlayer库提供了LoopingMediaSource实现循环播放。
// 单个资源循环播放 可指定loopCount循环次数
MediaSource source = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
MediaSource mediaSource = new LoopingMediaSource(source, loopCount);
// 多个资源循环播放
MediaSource source = new ConcatenatingMediaSource(mediaSources);
MediaSource mediaSource = new LoopingMediaSource(source, loopCount); // 添加事件
exoPlayer.addListener(listener);
// 移除事件
exoPlayer.removeListener(listener);
private Player.DefaultEventListener listener = new Player.DefaultEventListener() {
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
// 视频播放状态
L.d("playbackState = " + playbackState + " playWhenReady = " + playWhenReady);
switch (playbackState){
case Player.STATE_IDLE:
// 空闲
break;
case Player.STATE_BUFFERING:
// 缓冲中
break;
case Player.STATE_READY:
// 准备好
break;
case Player.STATE_ENDED:
// 结束
break;
default:
break;
}
}
@Override
public void onPlayerError(ExoPlaybackException error) {
// 报错
switch (error.type){
case ExoPlaybackException.TYPE_SOURCE:
// 加载资源时出错
break;
case ExoPlaybackException.TYPE_RENDERER:
// 渲染时出错
break;
case ExoPlaybackException.TYPE_UNEXPECTED:
// 意外的错误
break;
}
}
};
如果不设置的话,ExoPlayer 默认使用的播放控制界面是PlayerControlView如果完全不想使用这个控制界面,可以在布局文件上面设置

<com.google.android.exoplayer2.ui.PlayerView
[...]
app:use_controller="false"/>
这样控制界面就不显示了。
自定义PlayerControlView的行为
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:show_timeout="10000"
app:fastforward_increment="30000"
app:rewind_increment="30000"/>
上面的举例中,快进和快退都改成了30秒。控制界面自动消失时间是10秒。
自定义PlayerControlView界面的外观

你可以自定义控制界面,然后在布局文件里设置属性 controller_layout_id。
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:controller_layout_id="@layout/custom_playback_control"/> PlayerControlView通过id来识别它使用的所有UI元素。当你自定义布局文件的时候,必须保持标准元素的id,例如@id/exo_play 或 @id/exo_pause,以便让PlayerControlView有机会找到它们。
默认的PlayerControlView的控制界面是R.layout.exo_playback_control_view.xml。你也可以直接从ExoPlayer库中复制至app的res目录下面,然后做相应的修改就能。
基本的播放差不多已经完成了。ExoPlayer还有众多高级功能,例如
1、资源剪切 ClippingMediaSource
2、倍速播放
3、字幕
4、播放流媒体
等等等等
还没有研究,有兴趣的小伙伴可以去看看。
695856371
|喜欢本站的同学可以收藏本站,或者加入我们大家一起来交流技术!
欢迎来到梁钟霖个人博客网站。本个人博客网页提供最新的站长新闻,各种互联网资讯。还提供个人博客模板,最新最全的java教程,java面试题。在此我将尽我最大所能将此个人博客网站做的最好!谢谢你们,愿诸君一起进步!
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-139191-1.html
美国靠得住
成天都在更新
我去你能在恶心我吗
估计这次小米公关费用花了不少