微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android播放视频的一些方式及优缺点

在Android中,我们有三种方式来实现视频的播放:

1、指定action_view的方式
指定Action为ACTION_VIEW
Data为Uri,Type为其MIME类型。

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse(url);
intent.setDataAndType(uri, "video/*");
context.startActivity(intent);

这种方式属于:使用设备自带的播放器

这里说的设备的播放器,指的是设备预装的播放器,或者用户安装的播放器等,如果有多个播放器都有action_view这个意图,用此方式播放视频时会弹框让用户选择,类似于我们打开浏览器的时候会提示我们使用哪个浏览器打开。

这种方式最简单,布局都不用写,会直接跳转到设备自带的播放器去播放。但是有些时候用起来很爽,例如做平板项目开发,设备系统是定制的,ROM预置了一种播放器,支持各种格式,功能强大,那我们直接使用岂不是美滋滋。

2、使用VideoView
在布局文件中使用VideoView;
Activity中结合MediaController来实现对其控制。

  <VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
...
String videoUrl = getIntent().getStringExtra("videoUrl");//视频地址
Uri uri = Uri.parse(videoUrl);

MediaController mController = new MediaController(this);
videoView.setVideoURI(uri);
videoView.setMediaController(mController);// 设置videoView和mController建立关联
mController.setMediaPlayer(videoView); // 设置mController和videoView建立关联
videoView.requestFocus();
videoView.start();

//一些回调监听
videoView.setonPreparedListener(...//加载(准备)完毕回调
videoView.setonCompletionListener(...//播放结束回调
videoView.setonErrorListener(...)//播放错误时回调

MediaController是安卓封装的辅助控制器,带有暂停,播放,停止,进度条等控件。通过VideoView+MediaController可以很轻松的实现视频播放、停止、快进、快退等功能

由于VideoVIew也是封装了一层MediaPlayer,属于是google在Android原生系统里面认集成的媒体播放方式,跟第一种方式不同,支持的视频格式非常有限(.3gp/.mp4/.mkv)
可见:Supported Media Formats文档

虽然VideoView的实现方式很简单,但是由于是自带的封装好的类,所以无论是播放器的大小、位置以及控制都不受我们控制。

所以这种方式一般用于界面UI要求不高,视频格式比较单一的情况。

3、使用MediaPlayer类和SurfaceView绘制视频播放。

首先,初始化SurfaceView,并设置Callback,Callback是SurfaceHolder的回掉函数,可以帮助控制SurfaceHolder。

SurfaceView sv = (SurfaceView) findViewById(R.id.surface_view);
SurfaceHolder holder = sv.getHolder();
holder.addCallback(new MyCallback());

为了可以播放视频或者使用Camera预览,我们需要指定其Buffer类型,设置风格

 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) sv.getLayoutParams();
lp.height = 640;
lp.width =640;
Log.d("tag","ViewGroup is created succese");
sv.setLayoutParams(lp);

其次,自定义callback,使其实现SurfaceHolder.Callback,用以监听SurfaceHolder的周期

class MyCallback implements SurfaceHolder.Callback {
        MediaPlayer player = new MediaPlayer();
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                player.setdisplay(holder);
                player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/Download/video_480x360.mp4");
                player.prepare();
                Log.d("tag","Player is prepare");
            } catch (Exception e) {
                // Todo Auto-generated catch block
                e.printstacktrace();
            }
            player.start();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if(player.isPlaying()){
                player.stop();
            }
            player.release();
            Log.d("tag","Player is release");
        }
    }

这种方式对比前面两种会稍微复杂一点点,但是能实现的功能也更多一点。

其它方式:
4.HTML5 + WebView
5.三方库:Vitamio

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐