Android多媒体开发系列文章
- Android多媒体开发:录音机
- Android多媒体开发:照相机
- TextureView+MediaPlayer实现在线短视频播放
- Android多媒体开发:第三方框架
TextureView+MediaPlayer实现在线短视频播放
列表item布局文件
其中VideoPlayer是自定义View,继承于RelativeLayout,是视频播放的关键类
VideoPlayer
public VideoPlayer(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
//初始化布局
private void initView() {
View view = View.inflate(getContext(), R.layout.video_play, this);
ButterKnife.bind(this,view);
...
}
实现视频播放功能的是TextureView,VideoMediaController视频播放控制器,自定义View,继承于RelativeLayout
视频播放(视频的初始化)
private void play(String url){
try {
mPlayer = MediaHelper.getInstance();
mPlayer.reset();
mPlayer.setDataSource(url);
//让MediaPlayer和TextureView进行视频画面的结合
mPlayer.setSurface(mSurface);
//设置监听
mPlayer.setOnBufferingUpdateListener(onBufferingUpdateListener);
mPlayer.setOnCompletionListener(onCompletionListener);
mPlayer.setOnErrorListener(onErrorListener);
mPlayer.setOnPreparedListener(onPreparedListener);
mPlayer.setScreenOnWhilePlaying(true);//在视频播放的时候保持屏幕的高亮
//异步准备
mPlayer.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
}
}
准备完成监听
private MediaPlayer.OnPreparedListener onPreparedListener = new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//隐藏视频加载进度条
mediaController.setPbLoadingVisiable(View.GONE);
//进行视频的播放
MediaHelper.play();
hasPlay = true;
//隐藏标题
mediaController.delayHideTitle();
//设置视频的总时长
mediaController.setDuration(mPlayer.getDuration());
//更新播放的时间和进度
mediaController.updatePlayTimeAndProgress();
}
};
进行TextureView控件创建的监听
videoView.setSurfaceTextureListener(surfaceTextureListener);
private TextureView.SurfaceTextureListener surfaceTextureListener = new TextureView.SurfaceTextureListener() {
//创建完成 TextureView才可以进行视频画面的显示
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
// Log.i(TAG,"onSurfaceTextureAvailable");
mSurface = new Surface(surface);//连接对象(MediaPlayer和TextureView)
play(info.url);
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
// Log.i(TAG,"onSurfaceTextureSizeChanged");
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
// Log.i(TAG,"onSurfaceTextureDestroyed");
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
// Log.i(TAG,"onSurfaceTextureUpdated");
}
};
VideoMediaController
布局文件如下
显示或者隐藏视频控制界面
private void showOrHideVideoController() {
if(llPlayControl.getVisibility() == View.GONE){
//显示(标题、播放按钮、视频进度控制)
tvTitle.setVisibility(View.VISIBLE);
ivPlay.setVisibility(View.VISIBLE);
//加载动画
Animation animation = AnimationUtils.loadAnimation(getContext(),R.anim.bottom_enter);
animation.setAnimationListener(new SimpleAnimationListener(){
@Override
public void onAnimationEnd(Animation animation) {
super.onAnimationEnd(animation);
llPlayControl.setVisibility(View.VISIBLE);
//过2秒后自动隐藏
mHandler.sendEmptyMessageDelayed(MSG_HIDE_CONTROLLER,2000);
}
});
//执行动画
llPlayControl.startAnimation(animation);
}else{
//隐藏(标题、播放按钮、视频进度控制)
tvTitle.setVisibility(View.GONE);
ivPlay.setVisibility(View.GONE);
//加载动画
Animation animation = AnimationUtils.loadAnimation(getContext(),R.anim.bottom_exit);
animation.setAnimationListener(new SimpleAnimationListener(){
@Override
public void onAnimationEnd(Animation animation) {
super.onAnimationEnd(animation);
llPlayControl.setVisibility(View.GONE);
}
});
//执行动画
llPlayControl.startAnimation(animation);
}
}
更新播放的时间和进度
public void updatePlayTimeAndProgress() {
//获取目前播放的进度
int currentPosition = MediaHelper.getInstance().getCurrentPosition();
//格式化
String useTime = formatDuration(currentPosition);
tvUseTime.setText(useTime);
//更新进度
int duration = MediaHelper.getInstance().getDuration();
if(duration == 0){
return;
}
int progress = 100*currentPosition/duration;
seekBar.setProgress(progress);
//发送一个更新的延时消息
mHandler.sendEmptyMessageDelayed(MSG_UPDATE_TIME_PROGRESS,500);
}
自定义SeekBar
sb_progress_drawable
-
-
-
-
列表的item滚动出屏幕时停止播放
private RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
//进行滑动
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//获取屏幕上显示的第一个条目和最后一个条目的下标
int firstVisibleItemPosition = lm.findFirstVisibleItemPosition();
int lastVisibleItemPosition = lm.findLastVisibleItemPosition();
//获取播放条目的下标
int currentPosition = adapter.currentPosition;
if((firstVisibleItemPosition > currentPosition || lastVisibleItemPosition < currentPosition) && currentPosition > -1){
//让播放隐藏的条目停止
MediaHelper.release();
adapter.currentPosition = -1;
adapter.notifyDataSetChanged();
}
}
};
代码:https://github.com/JackChan1999/VideoPlayer