播放网络视频,缓冲播放,有进度条、时间显示、横竖屏切换

来源:互联网 发布:windows phone10 编辑:程序博客网 时间:2024/04/29 00:31

最近再做视频方面的项目,包括播放网络视频的功能。

实现的功能:

1、边缓冲边播放(没有做视频的本地缓存),缓冲时会有longding的状态提示

2、可以横竖屏切换,自动全屏

3、时间同步显示

4、进度条同步更新

基本上就是一些基础的功能,就是MediaController的相关功能。这里还能优化的就是,自动隐藏顶部和底部的 控制视图,这个就是添加一个动画而已,大家自行解决吧;


我这里是写了一个播放器类,用于外部调用,我这里用的是Videoview,没什么难得知识点;

功能点实现:

1、缓冲播放、进度条同步

@Overridepublic void onPrepared(MediaPlayer player) {Log.e(TAG, "the mediaplayer id prepared.");totalTime.setText(duration2Time(player.getDuration()));//显示总视频时长player.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {@Overridepublic void onBufferingUpdate(MediaPlayer player,int bufferingProgress) {try {skbProgress.setSecondaryProgress(bufferingProgress);//更新缓冲进度VideoPlyer.this.bufferingProgress = bufferingProgress;int currentProgress = skbProgress.getMax()* player.getCurrentPosition()/ player.getDuration();Log.e("onBufferingUpdate", "load:" + bufferingProgress+ "%__" + "play:" + currentProgress + "%");// 同步刷新播放进度Message msg = mHandler.obtainMessage(player.getCurrentPosition(), currentProgress,bufferingProgress);mHandler.sendMessage(msg);} catch (Exception e) {Log.e("VideoPlayer", "error msg:" + e.getMessage());}}});mVideoView.start();}


@SuppressLint("HandlerLeak")private Handler mHandler = new Handler() {public void handleMessage(android.os.Message msg) {if (msg.arg1 >= msg.arg2) {if (bufferingProgress == 0) {if (!creatingProgress.isShowing()) {show();if (mVideoView.isPlaying()) {dismiss();}}} else {show();}} else {dismiss();}};};


注:主要就是实现OnBufferingUpdateListener这一个监听,onBufferingUpdate中的第二个参数就是缓冲的数据,配合handler显示loading的状态。主要就是判断缓冲的和播放的进度,实现状态的提示


2、横竖屏切换

在activity的属性中添加以下内容:

android:configChanges="keyboardHidden|orientation|screenSize"

 配合VideoView就可以完美解决


3、时间显示

private final Handler timeHandler = new Handler();
<span style="white-space:pre"></span>/** * 更新播放时间 *  * @author Gogh */public void updatePlayTimer() {if (null != mVideoView) {int pos = mVideoView.getCurrentPosition();int min = (pos / 1000) / 60;int sec = (pos / 1000) % 60;curTime.setText(resetTime(min) + ":" + resetTime(sec));int currentProgress = skbProgress.getMax()* mVideoView.getCurrentPosition()/ mVideoView.getDuration();skbProgress.setProgress(currentProgress);Runnable notification = new Runnable() {@Overridepublic void run() {updateTimer();}};timeHandler.post(notification);}}

注:递归调用更新时间的显示

好了,主要的代码都在这了,业务逻辑可以自己实现 ,有哪里不对的还请多多指教。

0 0
原创粉丝点击