##視訊處理
一丶VideoView控件
點選建立一個播放器并播放視訊
public void play(View view){
vv.setVideoPath(path);
vv.start();
vv.seekTo(currentPositon);//從停的位置開始播放
}
public void pause(View view){
if(vv != null){
//記錄目前播放的位置
currentPositon = vv.getCurrentPosition();
vv.pause();
//重新播放vv.resume();
}
}
public void stop(View view){
if(vv != null){
vv.stopPlayback();
}
}
注://保持不要屏保
vv.setKeepScreenOn(true);
//支援畫中畫的效果
vv.setZOrderMediaOverlay(true);
二丶SurfaceView 表面視圖
可以在别的線程修改更新UI
雙緩沖概念:兩個線程共同作用
适合視訊播放,适合遊戲界面的渲染
SurfaceView重量級控件, 記憶體開銷比較大,cpu開銷比較大,
雙緩沖切換器建立好了
隻有SurfaceView界面使用者可見了。才可以執行邏輯。
如果SurfaceView界面使用者不可見。資源就會被回收。
例:
public class MainActivity extends Activity {
private SurfaceView sfv;
private MediaPlayer mp;
private String path = "視訊的位址";
private SurfaceHolder sh;
private int currentposition ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sfv = (SurfaceView) findViewById(R.id.sfv);
//surfaceholder控制器,作用:1.維護雙緩沖機制,另一個是控制視訊播放
sh = sfv.getHolder();
//設定一個回掉函數
sh.addCallback(new SurfaceHolder.Callback() {
// 當播放停止的時候調用(點選最小化及退出按鈕時)
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(mp != null && mp.isPlaying()){
mp.stop();
}
}
//當視訊架構建立時調用
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
System.out.println("視訊播放器準備好了!");
//執行個體化
mp = new MediaPlayer();
//設定播放路徑
mp.setDataSource(path);
//設定播放器的控制器
mp.setDisplay(sh);
//準備播放
mp.prepareAsync();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
});
//不要黑屏
sfv.setKeepScreenOn(true);
//支援畫中畫
sfv.setZOrderMediaOverlay(true);
}
public void play(View view){
if(mp == null){
mp = new MediaPlayer();
try {
//将mp設定為初始狀态
mp.reset();
//設定播放路徑
mp.setDataSource("http://192.168.1.21:8080/video/tianlongbabu.mp4");
//設定播放器
mp.setDisplay(sh);
//準備播放(異步準備)
mp.prepareAsync();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mp.start();
mp.seekTo(currentposition);
}
}
public void pause(View view){
if(mp != null && mp.isPlaying()){
currentposition = mp.getCurrentPosition();
mp.pause();
}
}
public void stop(View view){
if(mp != null && mp.isPlaying()){
currentposition = mp.getCurrentPosition();
mp.stop();
mp.release();
mp = null;
}
}
}