1. 程式人生 > >VideoView以及Surface+MediaPlayer播放視訊RAW下視訊方式

VideoView以及Surface+MediaPlayer播放視訊RAW下視訊方式

一:首先講VideoView

1videoView的第一種播放方式: videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.ceshi));//ceshi是在RAW目錄下的mp4視訊

         videoView.start();

2 videoview的第二種播放方式:

  //輸入流

   InputStream in = getApplicationContext().getResources().openRawResource(R.raw.ceshi);

   //輸出流

    OutputStream out = new FileOutputStream(“要寫入到sd卡的路徑videoPath”);

   //將資原始檔welcome_media.mp4寫入到sd卡
    byte[] buffer = new byte[1024];
    int length;
     while ((length = in.read(buffer)) > 0) {
     out.write(buffer, 0, length);
    }
     out.flush();       //重新整理
     out.close();        //關閉
      in.close();

File file = new File(videoPath);
if (!file.exists()){
   Log.i("MainActivity0", "視訊檔案不存在");
}else {
    videoView.setVideoPath(file.getPath());//這個API播放的是sd卡上的視訊
 
 //迴圈播放
 videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
       @Override
       public void onPrepared(MediaPlayer mp) {
           mp.setLooping(true);
       }
   });
     videoView.start();
    }

二:SurfaceView+MediaPlayer播放視訊

sv = (SurfaceView) findViewById(R.id.sv);

//Surface視訊播放
        holder = sv.getHolder();// 得到SurfaceView的容器,介面內容是顯示在容器裡面的。
        // 過時的api,必須寫,如果4.0以上的系統,不寫完全沒問題, 4.0一下的系統必須要寫
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        // surfaceView 被建立是需要花費一定的時間的。
        // 在oncreate方法執行的時候 surfaceViewHolder還沒有完全創建出來。
        holder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                System.out.println("surfaceview 的holder被銷燬了。");
                position = mediaplayer.getCurrentPosition();// 記錄上次播放的位置,然後停止。
                mediaplayer.stop();
                mediaplayer.release();
                mediaplayer = null;

            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                System.out.println("surfaceview 的holder被建立好了");
                try {

                   //     InputStream in = getApplicationContext().getResources().openRawResource(R.raw.ceshi);//如果需要將視訊儲存到本地sd卡上,可以用這個方法來獲取到流

                    AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(R.raw.ceshi);//獲取raw下的視訊檔案  ;
                    mediaplayer = new MediaPlayer();
                    mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaplayer.setDataSource(/*"/sdcard/ceshi.mp4"*/afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());//引數裡的註釋是直接播放sd卡上的視訊
                    mediaplayer.setDisplay(holder);
                    mediaplayer.prepareAsync();
                    mediaplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            Intent intent = new Intent(mContext, GuideActivity.class);
                            startActivity(intent);
                            finish();
                        }
                    });
                    mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mediaplayer.start();
                            if (position > 0) {
                                mediaplayer.seekTo(position);
                            }
                        }
                    });
                } catch (Exception e) {
                    System.out.println("surfaceview--失敗:");
                    Toast.makeText(mContext, "播放失敗", 0).show();
                    e.printStackTrace();
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format,
                                       int width, int height) {
                System.out.println("surface view的大小發生變化。");
            }
        });