在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] 举报,一经查实,本站将立刻删除。