android 98 MediaPlayer+SurfaceView播放视频

package com.itheima.videoplayer;

import java.io.IOException;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class MainActivity extends Activity {
    private MediaPlayer player;//只能播放MP4和3gp格式视频
    static int currentPosition;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);//SurfaceView标签要先显示在页面才能使用,因此要另外开启一个线程睡一会让布局生成了再去使用SurfaceView对象。
        SurfaceView sv = (SurfaceView) findViewById(R.id.sv);//视频播放画面
        //拿到surfaceview的控制器
        final SurfaceHolder sh = sv.getHolder();
//        Thread t = new Thread(){
//            @Override
//            public void run() {
//                try {
//                    sleep(200);        //200毫秒不能写死
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                runOnUiThread(new Runnable() {   //在主线程去执行
//                    @Override
//                    public void run() {
//                        MediaPlayer player = new MediaPlayer();
//                        player.reset();
//                        try {
//                            player.setDataSource("sdcard/2.3gp");
//                            player.setDisplay(sh);
//                            player.prepare();
//                            player.start();
//                        } catch (Exception e) {
//                            e.printStackTrace();
//                        } 
//                    }
//                });
//            }
//        };
//        t.start();
        sh.addCallback(new Callback() {
            //surfaceView销毁时调用
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                //每次surfaceview销毁时,同时停止播放视频
                if(player != null){
                    currentPosition = player.getCurrentPosition();
                    player.stop();
                    player.release();
                    player = null;
                }
            }
            //surfaceView创建时调用surfaceView可见时调用
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                //每次surfaceView创建时才去播放视频
                if(player == null){
                    player = new MediaPlayer();
                    player.reset();
                    try {
                        player.setDataSource("sdcard/2.3gp");
                        player.setDisplay(sh);
                        player.prepare();
                        player.start();
                        player.seekTo(currentPosition);
                    } catch (Exception e) {
                        e.printStackTrace();
                    } 
                }
            }
            //surfaceView结构改变时调用
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width,
                    int height) {
            }
        });
    }
}
/*页面:
<SurfaceView
    android:id="@+id/sv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>
---
#视频播放器
##SurfaceView
* 对画面的实时更新要求较高
* 双缓冲技术:内存中有两个画布,A画布显示至屏幕,B画布在内存中绘制下一帧画面,绘制完毕后B显示至屏幕,A在内存中继续绘制下一帧画面
* 播放视频也是用MediaPlayer,不过跟音频不同,要设置显示在哪个SurfaceView
 */

 vitamio播放视频:

 

package com.itheima.videoview;

import io.vov.vitamio.LibsChecker;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //检测是否支持vitamio,没有安装就安装
        if (!LibsChecker.checkVitamioLibs(this)) {return;}
        VideoView vv = (VideoView) findViewById(R.id.vv);
        vv.setVideoPath("sdcard/4.rmvb");
        vv.start();
        vv.setMediaController(new MediaController(this));//视频播放控制器
    }
}
/*
###SurfaceView
* 双缓冲技术
* 重量级组件(占用资源多)
* 只要不可见,就不会创建,可见时,才会创建
* 只要不可见,就会销毁
### FFMPEG
* 开源免费的音视频编解码器,用C语言开发。
### Vitamio
* 封装了FFMPEG的视频播放框架
* 对外提供的api全部都是javaApi*/
/*<io.vov.vitamio.widget.VideoView
    android:id="@+id/vv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>*/
//清单文件:<activity android:name="io.vov.vitamio.activity.InitActivity"></activity>

 

                

posted @ 2015-11-15 15:34  无天666  阅读(362)  评论(0编辑  收藏  举报