zoukankan      html  css  js  c++  java
  • 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>

                    

  • 相关阅读:
    3089:爬楼梯
    7592:求最大公约数问题
    JVM中内存回收深入分析,各种垃圾收集器
    PKU 1064 Cable master
    【面试&笔试】ASP.NET的相关问题
    1027. Colors in Mars (20) PAT
    DB_WRITER_PROCESSES与LOG_ARCHIVE_MAX_PROCESSES
    fedora下体验gentoo安装
    一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数
    [置顶] export命令-linux
  • 原文地址:https://www.cnblogs.com/yaowen/p/4966674.html
Copyright © 2011-2022 走看看