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:使用mediaplayer播放res/raw文件夹中的音乐

(1)在res文件夹中新建一个文件夹重命名为raw,并且将要播放的音乐放到raw文件夹里面 (2)修改layout目录下的xml布局文件,添加3个按钮空间和一个文本控件,用于提示当前播放状态和 播放暂...

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

private Uri mUri @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(s...

Android_多媒体

本文介绍多媒体的音频和视频播放。 播放音频和视频的源文件可以是一下三种: 源文件(即res/raw下或assets下)文件系统(即sdcard)流媒体(即网络) 1. 播放音频文件 播放音频文件...

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

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

Android Video播放Raw目录下的视频文件

比赛中遇到的一道题目就是从播放Raw目录下的视频,由于平常的开发中从来没这么干过,完全不符合常理的事情。下面记录一下播放的方法: mVideoView = (VideoView) fin...

【Android实战】播放assets或者raw文件夹下的视频文件

Android播放assets或者raw文件夹下的视频文件

播放Android项目工程里的视频文件

今天做了一个功能,就是播放项目工程里面的视频文件,不是播放SD卡视频文件。 我开始尝试把视频文件放到 assets文件目录下。 因为之前写webview加载assets文件夹时,是这样写的...

Android VideoView播放raw内视频

一个标点。。。浪费的时间。。。 用VideoView播放raw内的视频,整了半天都报错:Failed to open file 'android:resource://***/2131099649'...
  • mengbjy
  • mengbjy
  • 2016年12月22日 17:36
  • 520

Android使用videoview播放res/raw下的视频

Android使用videoview播放res/raw下的视频videoView.setVideoURI(Uri.parse("android.resource://com.leapfrog.merg...

Android中使用MediaPlayer类和SurfaceView播放视频

这是个简单的例子复制就能运行,都是将基本功能,要写的复杂点要对mediaplayer深入了解 效果 项目结构 视频的资源放在res---->raw------>xiaopingguo.mp4 布局...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VideoView以及Surface+MediaPlayer播放视频RAW下视频方式
举报原因:
原因补充:

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