VideoView以及Surface+MediaPlayer播放视频RAW下视频方式

原创 2017年01月03日 23:00:14

一:首先讲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的大小发生变化。");
            }
        });







Android中关于assets和raw播放音频视频的实践

Android开发中经常要播放音频视频等文件,比如扫描到二维码条形码用“嘀”一声来提示用户,比如刷微博刷新会播放一个声音,再比如有的APP在开启后会播放一段动画(视频),等等。这些文件保存在工程的as...
  • ada_dengpan
  • ada_dengpan
  • 2016年03月01日 21:31
  • 12331

获取raw下的视频文件并播放

private Uri mUri @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(s...
  • telencool
  • telencool
  • 2013年10月12日 22:27
  • 4248

Android视频播放之边缓存边播放

最近在做Android视频播放的有关项目,其中有一项需求就是要求视频可以边加载缓存边播放,类似于优酷土豆的视频点播。网上找了一些相关的资料,比较了每种视频格式的优缺点之后,结合Android手机自身的...
  • liuhonggang23
  • liuhonggang23
  • 2015年10月20日 11:43
  • 10838

VideoView播放视频异常MediaPlayer: Error (1,-2147483648)

异常信息如下: 05-28 23:19:52.019 15284-15284/com.softpo.videodemo E/dalvikvm: Could not find class 'andro...
  • qq654783742
  • qq654783742
  • 2017年06月29日 10:04
  • 204

Android两种播放视频的方法(SurfaceView+MediaPlayer+SeekBar)跟(VideoView+MediaController)

1、这两种方法经常被使用播放视频,一般人喜欢使用Videoview控件因为功能都有自带的减少代码量,但是SurfaceView也在用,所以分享两种方法。执行效果如下:第一种方法:使用SurfaceVi...
  • qq_33524771
  • qq_33524771
  • 2017年02月22日 19:57
  • 245

Android两种播放视频的方法(SurfaceView、MediaPlayer、SeekBar)和(VideoView、MediaController)等两种方法。

一、第一种方法 (使用SufaceView\MediaPlayer\SekBar实现视频播放) 二、第二种方法(使用VideoView、MediaControl) activity_main...
  • qq_37466405
  • qq_37466405
  • 2017年02月25日 14:19
  • 478

VideoView播放视频异常MediaPlayer: Error (1,-2147483648)

MediaPlayer: Error (1,-2147483648) 异常信息如下:05-28 23:19:52.019 15284-15284/com.softpo.videodemo E/dalv...
  • Soft_Po
  • Soft_Po
  • 2016年05月29日 11:26
  • 2705

多媒体之播放视频——VideoView和MediaPlayer(MediaPlayer和SurfaceView结合)

VideoView 后面讲解SurfaceView。 只支持3gp和MP4格式的视频格式的播放使用:VideoView的使用非常简单,布局只需要添加VideoView组件,设置宽高即可,代码中,主...
  • womengmengyan
  • womengmengyan
  • 2015年09月15日 15:11
  • 6040

Android下使用VideoView配合MediaController播放视频Demo

  • 2013年11月27日 21:13
  • 1.31MB
  • 下载

使用VideoView 播放视频

  • 2012年03月02日 09:39
  • 24KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VideoView以及Surface+MediaPlayer播放视频RAW下视频方式
举报原因:
原因补充:

(最多只允许输入30个字)