在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → Android视频播放器

Android视频播放器

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:10.15M
  • 下载次数:73
  • 浏览次数:796
  • 发布时间:2016-04-22
  • 实例类别:一般编程问题
  • 发 布 人:cj519965573
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 播放器 Android 视频 播放 d

实例介绍

【实例简介】

【实例截图】

【核心代码】

package com.example.vediotest;

import com.baidu.cyberplayer.core.BVideoView;
import com.baidu.cyberplayer.core.BVideoView.OnCompletionListener;
import com.baidu.cyberplayer.core.BVideoView.OnErrorListener;
import com.baidu.cyberplayer.core.BVideoView.OnInfoListener;
import com.baidu.cyberplayer.core.BVideoView.OnPreparedListener;
import com.baidu.cyberplayer.core.BVideoView.OnPlayingBufferCacheListener;

import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
import android.os.Process;
import android.os.PowerManager.WakeLock;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class VideoViewPlayingActivity extends Activity implements
		OnPreparedListener, OnCompletionListener, OnErrorListener,
		OnInfoListener, OnPlayingBufferCacheListener {

	private final String TAG = "VideoViewPlayingActivity";

	/**
	 * 鎮ㄧ殑AK 璇峰埌http://console.bce.baidu.com/iam/#/iam/accesslist鑾峰彇
	 */
	private String AK = ""; // 璇峰綍鍏ユ偍鐨凙K !!!

	private String mVideoSource = null;

	private ImageButton mPlaybtn = null;
	private ImageButton mPrebtn = null;
	private ImageButton mForwardbtn = null;

	private LinearLayout mController = null;

	private SeekBar mProgress = null;
	private TextView mDuration = null;
	private TextView mCurrPostion = null;

	/**
	 * 璁板綍鎾斁浣嶇疆
	 */
	private int mLastPos = 0;

	/**
	 * 鎾斁鐘舵?
	 */
	private enum PLAYER_STATUS {
		PLAYER_IDLE, PLAYER_PREPARING, PLAYER_PREPARED,
	}

	private PLAYER_STATUS mPlayerStatus = PLAYER_STATUS.PLAYER_IDLE;

	private BVideoView mVV = null;

	private EventHandler mEventHandler;
	private HandlerThread mHandlerThread;

	private final Object SYNC_Playing = new Object();

	private WakeLock mWakeLock = null;
	private static final String POWER_LOCK = "VideoViewPlayingActivity";

	private boolean mIsHwDecode = false;

	private final int EVENT_PLAY = 0;
	private final int UI_EVENT_UPDATE_CURRPOSITION = 1;

	class EventHandler extends Handler {
		public EventHandler(Looper looper) {
			super(looper);
		}

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case EVENT_PLAY:
				/**
				 * 濡傛灉宸茬粡鎾斁浜嗭紝绛夊緟涓婁竴娆℃挱鏀剧粨鏉?
				 */
				if (mPlayerStatus != PLAYER_STATUS.PLAYER_IDLE) {
					synchronized (SYNC_Playing) {
						try {
							SYNC_Playing.wait();
							Log.v(TAG, "wait player status to idle");
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}

				/**
				 * 璁剧疆鎾斁url
				 */
				mVV.setVideoPath(mVideoSource);

				/**
				 * 缁挱锛屽鏋滈渶瑕佸姝?
				 */
				if (mLastPos > 0) {

					mVV.seekTo(mLastPos);
					mLastPos = 0;
				}

				/**
				 * 鏄剧ず鎴栬?闅愯棌缂撳啿鎻愮ず
				 */
				mVV.showCacheInfo(true);

				/**
				 * 寮?鎾斁
				 */
				mVV.start();

				mPlayerStatus = PLAYER_STATUS.PLAYER_PREPARING;
				break;
			default:
				break;
			}
		}
	}

	Handler mUIHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			/**
			 * 鏇存柊杩涘害鍙婃椂闂?
			 */
			case UI_EVENT_UPDATE_CURRPOSITION:
				int currPosition = mVV.getCurrentPosition();
				int duration = mVV.getDuration();
				updateTextViewWithTimeFormat(mCurrPostion, currPosition);
				updateTextViewWithTimeFormat(mDuration, duration);
				mProgress.setMax(duration);
				if (mVV.isPlaying()) {
					mProgress.setProgress(currPosition);
				}
				mUIHandler.sendEmptyMessageDelayed(
						UI_EVENT_UPDATE_CURRPOSITION, 200);
				break;
			default:
				break;
			}
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.controllerplaying);

		PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
		mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
				| PowerManager.ON_AFTER_RELEASE, POWER_LOCK);

		mIsHwDecode = getIntent().getBooleanExtra("isHW", false);
		Uri uriPath = getIntent().getData();
		if (null != uriPath) {
			String scheme = uriPath.getScheme();
			if (null != scheme) {
				mVideoSource = uriPath.toString();
			} else {
				mVideoSource = uriPath.getPath();
			}
		}

		initUI();

		/**
		 * 寮?惎鍚庡彴浜嬩欢澶勭悊绾跨▼
		 */
		mHandlerThread = new HandlerThread("event handler thread",
				Process.THREAD_PRIORITY_BACKGROUND);
		mHandlerThread.start();
		mEventHandler = new EventHandler(mHandlerThread.getLooper());

	}

	/**
	 * 鍒濆鍖栫晫闈?
	 */
	private void initUI() {
		mPlaybtn = (ImageButton) findViewById(R.id.play_btn);
		mPrebtn = (ImageButton) findViewById(R.id.pre_btn);
		mForwardbtn = (ImageButton) findViewById(R.id.next_btn);
		mController = (LinearLayout) findViewById(R.id.controlbar);

		mProgress = (SeekBar) findViewById(R.id.media_progress);
		mDuration = (TextView) findViewById(R.id.time_total);
		mCurrPostion = (TextView) findViewById(R.id.time_current);

		registerCallbackForControl();

		/**
		 * 璁剧疆ak
		 */
		BVideoView.setAK(AK);

		/**
		 * 鑾峰彇BVideoView瀵硅薄
		 */
		mVV = (BVideoView) findViewById(R.id.video_view);

		/**
		 * 娉ㄥ唽listener
		 */
		mVV.setOnPreparedListener(this);
		mVV.setOnCompletionListener(this);
		mVV.setOnErrorListener(this);
		mVV.setOnInfoListener(this);

		/**
		 * 璁剧疆瑙g爜妯″紡
		 */
		mVV.setDecodeMode(mIsHwDecode ? BVideoView.DECODE_HW
				: BVideoView.DECODE_SW);
	}

	/**
	 * 涓烘帶浠舵敞鍐屽洖璋冨鐞嗗嚱鏁?
	 */
	private void registerCallbackForControl() {
		mPlaybtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				// TODO Auto-generated method stub

				if (mVV.isPlaying()) {
					mPlaybtn.setImageResource(R.drawable.play_btn_style);
					/**
					 * 鏆傚仠鎾斁
					 */
					mVV.pause();
				} else {
					mPlaybtn.setImageResource(R.drawable.pause_btn_style);
					/**
					 * 缁х画鎾斁
					 */
					mVV.resume();
				}

			}
		});

		/**
		 * 瀹炵幇鍒囨崲绀轰緥
		 */
		mPrebtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				/**
				 * 濡傛灉宸茬粡鎾斁浜嗭紝绛夊緟涓婁竴娆℃挱鏀剧粨鏉?
				 */
				if (mPlayerStatus != PLAYER_STATUS.PLAYER_IDLE) {
					mVV.stopPlayback();
				}

				/**
				 * 鍙戣捣涓?鏂扮殑鎾斁浠诲姟
				 */
				if (mEventHandler.hasMessages(EVENT_PLAY))
					mEventHandler.removeMessages(EVENT_PLAY);
				mEventHandler.sendEmptyMessage(EVENT_PLAY);
			}
		});

		mForwardbtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				// TODO Auto-generated method stub

			}
		});

		OnSeekBarChangeListener osbc1 = new OnSeekBarChangeListener() {
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO Auto-generated method stub
				// Log.v(TAG, "progress: "   progress);
				updateTextViewWithTimeFormat(mCurrPostion, progress);
			}

			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub
				/**
				 * SeekBar寮?seek鏃跺仠姝㈡洿鏂?
				 */
				mUIHandler.removeMessages(UI_EVENT_UPDATE_CURRPOSITION);
			}

			public void onStopTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub
				int iseekPos = seekBar.getProgress();
				/**
				 * SeekBark瀹屾垚seek鏃舵墽琛宻eekTo鎿嶄綔骞舵洿鏂扮晫闈?
				 * 
				 */
				mVV.seekTo(iseekPos);
				Log.v(TAG, "seek to "   iseekPos);
				mUIHandler.sendEmptyMessage(UI_EVENT_UPDATE_CURRPOSITION);
			}
		};
		mProgress.setOnSeekBarChangeListener(osbc1);
	}

	private void updateTextViewWithTimeFormat(TextView view, int second) {
		int hh = second / 3600;
		int mm = second % 3600 / 60;
		int ss = second % 60;
		String strTemp = null;
		if (0 != hh) {
			strTemp = String.format("%02d:%02d:%02d", hh, mm, ss);
		} else {
			strTemp = String.format("%02d:%02d", mm, ss);
		}
		view.setText(strTemp);
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		/**
		 * 鍦ㄥ仠姝㈡挱鏀惧墠 浣犲彲浠ュ厛璁板綍褰撳墠鎾斁鐨勪綅缃?浠ヤ究浠ュ悗鍙互缁挱
		 */
		if (mPlayerStatus == PLAYER_STATUS.PLAYER_PREPARED) {
			mLastPos = mVV.getCurrentPosition();
			mVV.stopPlayback();
		}
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.v(TAG, "onResume");
		if (null != mWakeLock && (!mWakeLock.isHeld())) {
			mWakeLock.acquire();
		}
		/**
		 * 鍙戣捣涓?鎾斁浠诲姟,褰撶劧鎮ㄤ笉涓?畾瑕佸湪杩欏彂璧?
		 */
		mEventHandler.sendEmptyMessage(EVENT_PLAY);
	}

	private long mTouchTime;
	private boolean barShow = true;

	@Override
	public boolean onTouchEvent(MotionEvent event) {

		// TODO Auto-generated method stub
		if (event.getAction() == MotionEvent.ACTION_DOWN)
			mTouchTime = System.currentTimeMillis();
		else if (event.getAction() == MotionEvent.ACTION_UP) {
			long time = System.currentTimeMillis() - mTouchTime;
			if (time < 400) {
				updateControlBar(!barShow);
			}
		}

		return true;
	}

	public void updateControlBar(boolean show) {

		if (show) {
			mController.setVisibility(View.VISIBLE);
		} else {
			mController.setVisibility(View.INVISIBLE);
		}
		barShow = show;
	}

	@Override
	protected void onStop() {
		super.onStop();
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		/**
		 * 閫?嚭鍚庡彴浜嬩欢澶勭悊绾跨▼
		 */
		mHandlerThread.quit();
	}

	@Override
	public boolean onInfo(int what, int extra) {
		// TODO Auto-generated method stub
		switch (what) {
		/**
		 * 寮?缂撳啿
		 */
		case BVideoView.MEDIA_INFO_BUFFERING_START:
			break;
		/**
		 * 缁撴潫缂撳啿
		 */
		case BVideoView.MEDIA_INFO_BUFFERING_END:
			break;
		default:
			break;
		}
		return true;
	}

	/**
	 * 褰撳墠缂撳啿鐨勭櫨鍒嗘瘮锛?鍙互閰嶅悎onInfo涓殑寮?缂撳啿鍜岀粨鏉熺紦鍐叉潵鏄剧ず鐧惧垎姣斿埌鐣岄潰
	 */
	@Override
	public void onPlayingBufferCache(int percent) {
		// TODO Auto-generated method stub

	}

	/**
	 * 鎾斁鍑洪敊
	 */
	@Override
	public boolean onError(int what, int extra) {
		// TODO Auto-generated method stub
		Log.v(TAG, "onError");
		synchronized (SYNC_Playing) {
			SYNC_Playing.notify();
		}
		mPlayerStatus = PLAYER_STATUS.PLAYER_IDLE;
		mUIHandler.removeMessages(UI_EVENT_UPDATE_CURRPOSITION);
		return true;
	}

	/**
	 * 鎾斁瀹屾垚
	 */
	@Override
	public void onCompletion() {
		// TODO Auto-generated method stub
		Log.v(TAG, "onCompletion");
		synchronized (SYNC_Playing) {
			SYNC_Playing.notify();
		}
		mPlayerStatus = PLAYER_STATUS.PLAYER_IDLE;
		mUIHandler.removeMessages(UI_EVENT_UPDATE_CURRPOSITION);
	}

	/**
	 * 鍑嗗鎾斁灏辩华
	 */
	@Override
	public void onPrepared() {
		// TODO Auto-generated method stub
		Log.v(TAG, "onPrepared");
		mPlayerStatus = PLAYER_STATUS.PLAYER_PREPARED;
		mUIHandler.sendEmptyMessage(UI_EVENT_UPDATE_CURRPOSITION);
	}
}

实例下载地址

Android视频播放器

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警