
推荐:
欢迎关注我创建的Android TV 简书专题,会定期给你们分享一些AndroidTV相关的内容:Android TV
前言:ExoPlayer是google推出的一个应用级的播放框架。接下来我来对它做一个简单的介绍。
1.支持更多的格式
我们知道Android 提供的mediaPlayer只支持有限的格式,比如视频,它支持MP4,3GP。想要播放其它格式的视频需要进行相应的转化。ExoPlayer提供了强大的格式支持。

ExoPlayer支持的外媒格是在多个级别定义的。 从最低层至最高层exoplayer jar,分别是:
2.ExoPlayer是java语言编写的,相比与MediaPlayer用Native Code来说,可以很明白的获取一些异常源跟进行个别代码调试。
3.ExoPlayer是开源的,github上地址ExoPlayer遇到问题后可以提交Issues,最近遭遇关于SimpleExoPlayer setVideoListener去OnVideoSizeChanged()时黑屏有声音,然后提交了一个Issues:The surface show nothing after mSimpleExoPlayer.setVideoListener(mVideoListener),他们随后帮了回复exoplayer jar,另外开源的代码经过大家的验证,也会变得的健壮。
4.ExoPlayer有强大的开发文档developer guide ,读者也可以按照文档更好的知道它。
这里演示一个播放器的简单使用。

<LinearLayout
android:id="@+id/activity_main"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.songwenju.useexoplayer.MainActivity">
<com.google.android.exoplayer2.ui.SimpleExoPlayerView
android:id="@+id/exoView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progressBar"
android:visibility="gone"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</com.google.android.exoplayer2.ui.SimpleExoPlayerView>
</LinearLayout>
这里使用了SimpleExoPlayerView,在其外部添加了一个ProgressBar。
初始化播放器:
/**
* 初始化player
*/
private void initPlayer() {
//1. 创建一个默认的 TrackSelector
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector =
new DefaultTrackSelector(videoTackSelectionFactory);
LoadControl loadControl = new DefaultLoadControl();
//2.创建ExoPlayer
mSimpleExoPlayer = ExoPlayerFactory.newSimpleInstance(this,trackSelector,loadControl);
//3.创建SimpleExoPlayerView
mExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.exoView);
//4.为SimpleExoPlayer设置播放器
mExoPlayerView.setPlayer(mSimpleExoPlayer);
}
开始播放:

private void playVideo() {
//测量播放过程中的带宽。 如果不需要,可以为null。
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
// 生成加载媒体数据的DataSource实例。
DataSource.Factory dataSourceFactory
= new DefaultDataSourceFactory(MainActivity.this,
Util.getUserAgent(MainActivity.this,"useExoplayer"),bandwidthMeter);
// 生成用于解析媒体数据的Extractor实例。
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
// MediaSource代表要播放的媒体。
MediaSource videoSource = new ExtractorMediaSource(playerUri,dataSourceFactory,extractorsFactory,
null,null);
//Prepare the player with the source.
mSimpleExoPlayer.prepare(videoSource);
//添加的listener
// mSimpleExoPlayer.setVideoListener(mVideoListener);
mSimpleExoPlayer.addListener(eventListener);
// mSimpleExoPlayer.setTextOutput(mOutput);
mSimpleExoPlayer.setPlayWhenReady(true);
}
播放器的状态:
private ExoPlayer.EventListener eventListener = new ExoPlayer.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
LogUtil.i(this,"onTimelineChanged");
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
LogUtil.i(this,"onTracksChanged");
}
@Override
public void onLoadingChanged(boolean isLoading) {
LogUtil.i(this,"onLoadingChanged");
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
LogUtil.i(this,"onPlayerStateChanged: playWhenReady = "+String.valueOf(playWhenReady)
+" playbackState = "+playbackState);
switch (playbackState){
case ExoPlayer.STATE_ENDED:
LogUtil.i(this,"Playback ended!");
//Stop playback and return to start position
setPlayPause(false);
mSimpleExoPlayer.seekTo(0);
break;
case ExoPlayer.STATE_READY:
mProgressBar.setVisibility(View.GONE);
LogUtil.i(this,"ExoPlayer ready! pos: "+mSimpleExoPlayer.getCurrentPosition()
+" max: "+stringForTime((int)mSimpleExoPlayer.getDuration()));
setProgress(0);
break;
case ExoPlayer.STATE_BUFFERING:
LogUtil.i(this,"Playback buffering!");
mProgressBar.setVisibility(View.VISIBLE);
break;
case ExoPlayer.STATE_IDLE:
LogUtil.i(this,"ExoPlayer idle!");
break;
}
}
@Override
public void onPlayerError(ExoPlaybackException error) {
LogUtil.i(this,"onPlaybackError: "+error.getMessage());
}
@Override
public void onPositionDiscontinuity() {
LogUtil.i(this,"onPositionDiscontinuity");
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
LogUtil.i(this,"MainActivity.onPlaybackParametersChanged."+playbackParameters.toString());
}
};
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-134562-1.html
果断把今天刚买的芝麻糊扔掉
来真格的让你有来无回