mSimpleExoPlayer.addListener(eventListener);
通过状态去显示loading条,做错误处理等。

Activity退出时,释放播放器:
@Override
protected void onPause() {
LogUtil.i(this,"MainActivity.onPause.");
super.onPause();
mSimpleExoPlayer.stop();
}
@Override
protected void onStop() {
LogUtil.i(this,"MainActivity.onStop.");
super.onStop();
mSimpleExoPlayer.release();
}
MainActivity完整的代码
public class MainActivity extends AppCompatActivity {
private SimpleExoPlayerView mExoPlayerView;
private SimpleExoPlayer mSimpleExoPlayer;
private Context mContext;
Uri playerUri = Uri.parse("https://storage.googleapis.com/android-tv/Sample%20videos/Demo%20Slam/Google%20Demo%20Slam_%20Hangin'%20with%20the%20Google%20Search%20Bar.mp4");
private ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
mContext = this;
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
initPlayer();
playVideo();
}
/**
* 初始化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);
}
TextRenderer.Output mOutput = new TextRenderer.Output() {
@Override
public void onCues(List<Cue> cues) {
LogUtil.i(this,"MainActivity.onCues.");
}
};
private SimpleExoPlayer.VideoListener mVideoListener = new SimpleExoPlayer.VideoListener() {
@Override
public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) {
LogUtil.i(this,"MainActivity.onVideoSizeChanged.width:"+width+", height:"+height);
}
@Override
public void onRenderedFirstFrame() {
LogUtil.i(this,"MainActivity.onRenderedFirstFrame.");
}
};
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());
}
};
/**
* Starts or stops playback. Also takes care of the Play/Pause button toggling
* @param play True if playback should be started
*/
private void setPlayPause(boolean play){
mSimpleExoPlayer.setPlayWhenReady(play);
}
private String stringForTime(int timeMs) {
StringBuilder mFormatBuilder;
Formatter mFormatter;
mFormatBuilder = new StringBuilder();
mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
int totalSeconds = timeMs / 1000;
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60) % 60;
int hours = totalSeconds / 3600;
mFormatBuilder.setLength(0);
if (hours > 0) {
return mFormatter.format("%d:d:d", hours, minutes, seconds).toString();
} else {
return mFormatter.format("d:d", minutes, seconds).toString();
}
}
@Override
protected void onPause() {
LogUtil.i(this,"MainActivity.onPause.");
super.onPause();
mSimpleExoPlayer.stop();
}
@Override
protected void onStop() {
LogUtil.i(this,"MainActivity.onStop.");
super.onStop();
mSimpleExoPlayer.release();
}
}
gitHub实例:useExoPlayer。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-134562-2.html
买股票和炒股票的区别
卧槽新歌