Android中VideoView及SurfaceView视频播放实现
Android中VideoView及SurfaceView视频播放实现
Android中播放视频可以通过两种方式来实现。一种是通过VideoView组件,该种方式实现起来比较简单容易,但是其可控性不强,可以完成简单的播放任务;另一种通过MediaPlayer在SurfaceView进行播放,该中方式实现起来比较麻烦,但是可控性极强。所以在实际的项目中可以根据不同的需求进行使用。
1、VideoView播放视频。
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.widget.MediaController;
import android.widget.VideoView;
public class VideoViewPlayVideo extends Activity {
private VideoView videoView=null;
private Uri uri=null;
private MediaController mController=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.videoview);
videoView=(VideoView)findViewById(R.id.videoView);
mController=new MediaController(this);
uri=Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/14-05-49.mp4");
videoView.setVideoURI(uri);
videoView.setMediaController(mController);
videoView.start();
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<VideoView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/videoView"
/>
</LinearLayout>
简单几步就可以实现一个基本的播放器,MediaController还提供了播放、暂停、滑块等功能。
2.MediaPlayer在SurfaceView上播放。MediaPlayer播放视频必须在SurfaceView上。先看代码:
import java.io.IOException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
//与SurfaceView相关的包
import android.view.Gravity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
//与MediaPlayer相关的包
import android.media.MediaPlayer;
//播放完毕
import android.media.MediaPlayer.OnCompletionListener;
//error信息
import android.media.MediaPlayer.OnErrorListener;
//info信息
import android.media.MediaPlayer.OnInfoListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnSeekCompleteListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
public class SurfaceViewPlayVideo extends Activity implements OnCompletionListener,OnErrorListener,OnInfoListener,OnPreparedListener,OnSeekCompleteListener,OnVideoSizeChangedListener,SurfaceHolder.Callback{
private Display currentDisplay=null;
private SurfaceView surfaceView=null;
private SurfaceHolder surfaceHoler=null;
private MediaPlayer mPlayer=null;
private int videoWidth=0,videoHeight=0;
private boolean readyToPlay=false;
private static final String TAG="-----VideoPlayer----";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//SurfaceView设置
surfaceView=(SurfaceView)findViewById(R.id.videoSurfaceView);
surfaceHoler=surfaceView.getHolder();
surfaceHoler.addCallback(this);
surfaceHoler.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//MediaPlayer设置
mPlayer=new MediaPlayer();
mPlayer.setOnCompletionListener(this);
mPlayer.setOnErrorListener(this);
mPlayer.setOnInfoListener(this);
mPlayer.setOnPreparedListener(this);
mPlayer.setOnSeekCompleteListener(this);
mPlayer.setOnVideoSizeChangedListener(this);
//播放歌曲路径
String filePath=Environment.getExternalStorageDirectory().getPath()+"/a.3gp";
try {
mPlayer.setDataSource(filePath);
} catch (IOException e) {
e.printStackTrace();
finish();
}
currentDisplay=getWindowManager().getDefaultDisplay();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
//create方法进行准备
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.v(TAG,"surfaceCreated method is called!!");
mPlayer.setDisplay(holder);
try {
mPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
finish();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
}
@Override
public void onSeekComplete(MediaPlayer mp) {
}
//播放处理
@Override
public void onPrepared(MediaPlayer mp) {
//全屏播放
//videoHeight=currentDisplay.getHeight();
//videoWidth=currentDisplay.getWidth();
//按视频本身大小播放
videoWidth=mPlayer.getVideoWidth();
videoHeight=mPlayer.getVideoHeight();
//在此可以根据情况进行缩放播放设置
LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(videoWidth,videoHeight);
//居中
lp.gravity=Gravity.CENTER_HORIZONTAL;
surfaceView.setLayoutParams(lp);
mPlayer.start();
}
//Info 信息处理
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
Log.v(TAG,"onInfo method is called!!");
if (what == MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING) {
Log.v(TAG, "Media Info, Media Info Bad Interleaving " + extra);
} else if (what == MediaPlayer.MEDIA_INFO_NOT_SEEKABLE) {
Log.v(TAG, "Media Info, Media Info Not Seekable " + extra);
} else if (what == MediaPlayer.MEDIA_INFO_UNKNOWN) {
Log.v(TAG, "Media Info, Media Info Unknown " + extra);
} else if (what == MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING) {
Log.v(TAG, "MediaInfo, Media Info Video Track Lagging " + extra);
}else if (what == MediaPlayer.MEDIA_INFO_METADATA_UPDATE) {
Log.v(TAG,"MediaInfo, Media Info Metadata Update " + extra);
}
return false;
}
//Error信息处理
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.v(TAG,"onError method is called!!");
if(what==MediaPlayer.MEDIA_ERROR_SERVER_DIED){
Log.v(TAG,"Media Error,Server Died"+extra);
}else if(what==MediaPlayer.MEDIA_ERROR_UNKNOWN){
Log.v(TAG,"Media Error,Error Unknown"+extra);
}
return false;
}
//播放完毕后,finish
@Override
public void onCompletion(MediaPlayer mp) {
Log.v(TAG,"onCompletion method is called!!");
finish();
}
//Activty销毁释放资源
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mPlayer.release();
mPlayer=null;
}
}
布局文件:<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<SurfaceView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/videoSurfaceView"
/>
</LinearLayout>
该种方式需要考虑SurfaceView问题,在该示例中没有加入视频播放的处理。因为在Surfaceview直接加入UI组件是不可以的(如Button),在后续的文章中将探讨SurfaceView与其他UI组件共存的问题。
3、因为博文字数限制,另外在此附上音乐播放器示例,该示例实现结果如图:
读取乐库,播放,暂停,快进,快退,上一首,下一首,滑块处理。基本常见的问题都在此进行实现。
示例下载地址http://115.com/file/anrqxnyp#MediaProfinal.zip。
原文链接:http://hi.baidu.com/shixying/item/7787a65eed93ae3795eb05f8
更多相关文章
- android 嵌套ViewPager + Fragment实现仿头条UI框架Demo
- Android(安卓)平台上长连接的实现
- Android实现底部弹出列表选择器
- android中轮播图的实现
- Android(安卓)实现QQ第三方登录
- OpenCV自学笔记31. Android(安卓)上使用jni和opencv 实现边缘检
- Android(安卓)轻松实现语音朗读
- Android实现滑动标签页
- 浅谈Java中Collections.sort对List排序的两种方法