zoukankan      html  css  js  c++  java
  • Android之SurfaceView实现视频播放

    1.案例一

    布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height
    ="fill_parent" android:weightSum="1">
    <SurfaceView android:layout_height="220dip" android:layout_gravity="center" android:id="@+id/surface" android:layout_weight="0.25" android:layout_width="320dip"></SurfaceView>
    <LinearLayout android:id="@+id/linearLayout1" android:layout_height="wrap_content" android:layout_width="fill_parent">
    <Button android:text="播放" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    <Button android:text="暂停" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    <Button android:text="停止" android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    </LinearLayout>
    </LinearLayout>

    主程序:

    public class SurfaceActivity extends Activity implements SurfaceHolder.Callback {
    /** Called when the activity is first created. */
    MediaPlayer player;
    SurfaceView surface;
    SurfaceHolder surfaceHolder;
    Button play,pause,stop;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    play=(Button)findViewById(R.id.button1);
    pause=(Button)findViewById(R.id.button2);
    stop=(Button)findViewById(R.id.button3);
    surface=(SurfaceView)findViewById(R.id.surface);

    surfaceHolder=surface.getHolder();  //SurfaceHolder是SurfaceView的控制接口
    surfaceHolder.addCallback(this);   //因为这个类实现了SurfaceHolder.Callback接口,所以回调参数直接this
    surfaceHolder.setFixedSize(320, 220);  //显示的分辨率,不设置为视频默认
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  //Surface类型

    play.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
    player.start();
    }});
            pause.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
    player.pause();
    }});
            stop.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
    player.stop();
    }});
    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
    }

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
    //必须在surface创建后才能初始化MediaPlayer,否则不会显示图像
    player=new MediaPlayer();
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    player.setDisplay(surfaceHolder);
    //设置显示视频显示在SurfaceView上
    try {
    player.setDataSource("/sdcard/3.mp4");
    player.prepare();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
    // TODO Auto-generated method stub

    }

    @Override
    protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    if(player.isPlaying()){
    player.stop();
    }
    player.release();
    //Activity销毁时停止播放,释放资源。不做这个操作,即使退出还是能听到视频播放的声音
    }
    }

    2.案例二

    布局文件main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    android:background
    ="#ffffff"
    >
    <TextView
    android:layout_width="wrap_content"
    android:layout_height
    ="wrap_content"
    android:text
    ="@string/filename"
    />
    <EditText android:layout_width="fill_parent"
    android:layout_height
    ="wrap_content"
    android:text
    ="oppo.mp4"
    android:id
    ="@+id/filename"
    />
    <LinearLayout
    android:orientation="horizontal"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="wrap_content"
    >
    <ImageButton android:layout_width="wrap_content"
    android:layout_height
    ="fill_parent"
    android:src
    ="@drawable/play"
    android:id
    ="@+id/play"
    />
    <ImageButton android:layout_width="wrap_content"
    android:layout_height
    ="fill_parent"
    android:src
    ="@drawable/pause"
    android:id
    ="@+id/pause"
    />
    <ImageButton android:layout_width="wrap_content"
    android:layout_height
    ="fill_parent"
    android:src
    ="@drawable/stop"
    android:id
    ="@+id/stop"
    />
    <ImageButton android:layout_width="wrap_content"
    android:layout_height
    ="fill_parent"
    android:src
    ="@drawable/reset"
    android:id
    ="@+id/reset"
    />
    </LinearLayout>
    <SurfaceView android:layout_width="fill_parent"
    android:layout_height
    ="fill_parent"
    android:id
    ="@+id/surfaceview"
    />
    </LinearLayout>

    主程序VodeoPlayActivity.java

    public class VodeoPlayActivity extends Activity {
    /** Called when the activity is first created. */
    private EditText filenamEditText;
    private MediaPlayer mediaPlayer;
    private String filename;
    private SurfaceView surfaceView;
    private final static String TAG="VodeoPlayActivity";
    private int prosition=0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    filenamEditText=(EditText) this.findViewById(R.id.filename);
    surfaceView=(SurfaceView)this.findViewById(R.id.surfaceview);
    surfaceView.getHolder().setFixedSize(176, 144);//设置分辨率
    surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//设置surfaceview不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前
    surfaceView.getHolder().addCallback(new SurceCallBack());//对surface对象的状态进行监听
    mediaPlayer=new MediaPlayer();

    ButtonOnClikListiner buttonOnClikListinero=new ButtonOnClikListiner();
    ImageButton start=(ImageButton) this.findViewById(R.id.play);
    ImageButton pause=(ImageButton) this.findViewById(R.id.pause);
    ImageButton stop=(ImageButton) this.findViewById(R.id.stop);
    ImageButton replay=(ImageButton) this.findViewById(R.id.reset);
    start.setOnClickListener(buttonOnClikListinero);
    pause.setOnClickListener(buttonOnClikListinero);
    stop.setOnClickListener(buttonOnClikListinero);
    replay.setOnClickListener(buttonOnClikListinero);
    }

    private final class ButtonOnClikListiner implements View.OnClickListener{
            @Override
    public void onClick(View v) {
    if(Environment.getExternalStorageState()==Environment.MEDIA_UNMOUNTED){
    Toast.makeText(VodeoPlayActivity.this, "sd卡不存在", Toast.LENGTH_SHORT).show();
    return;
    }
    filename=filenamEditText.getText().toString();
    switch (v.getId()) {
    case R.id.play:
    play();
    break;
    case R.id.pause:
    if(mediaPlayer.isPlaying()){
    mediaPlayer.pause();
    }else{
    mediaPlayer.start();
    }
    break;
    case R.id.reset:
    if(mediaPlayer.isPlaying()){
    mediaPlayer.seekTo(0);
    }else{
    play();
    }
    break;
    case R.id.stop:
    if(mediaPlayer.isPlaying()){
    mediaPlayer.stop();
    }
    break;
    }
    }
    }

    private void play() {
    try {
    File file=new File(Environment.getExternalStorageDirectory(),filename);
    mediaPlayer.reset();//重置为初始状态
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置音乐流的类型
    mediaPlayer.setDisplay(surfaceView.getHolder());//设置video影片以surfaceviewholder播放
    mediaPlayer.setDataSource(file.getAbsolutePath());//设置路径
    mediaPlayer.prepare();//缓冲
    mediaPlayer.start();//播放
    } catch (Exception e) {
    Log.e(TAG, e.toString());
    e.printStackTrace();
    }
    }

    private final class SurceCallBack implements SurfaceHolder.Callback{
    /**
    * 画面修改
    */
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
    // TODO Auto-generated method stub

    }

    /**
    * 画面创建
    */
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    if(prosition>0&&filename!=null){
    play();
    mediaPlayer.seekTo(prosition);
    prosition=0;
    }

    }

    /**
    * 画面销毁
    */
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    if(mediaPlayer.isPlaying()){
    prosition=mediaPlayer.getCurrentPosition();
    mediaPlayer.stop();
    }
    }
    }
    }
  • 相关阅读:
    [HNOI2002]营业额统计_Treap
    Catch That Cow_bfs
    Knight Moves
    Hie with the Pie
    tp5.1 错误 No input file specified.
    Jmeter通过BeanShell Sampler获取Jmeter的Bin路径,并存入变量供后面的脚本调用
    Jmeter如何把CSV文件的路径设置成一个变量,且变量的值是一个相对路径
    Autotest Weekly Report
    调试Javascript代码(浏览器F12)
    Javascript中escape()、encodeURI()、encodeURIComponent()的区别
  • 原文地址:https://www.cnblogs.com/makeryan/p/2495673.html
Copyright © 2011-2022 走看看