实例介绍
【实例简介】
【实例截图】

【核心代码】
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);
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论