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

更多相关文章

  1. android 嵌套ViewPager + Fragment实现仿头条UI框架Demo
  2. Android(安卓)平台上长连接的实现
  3. Android实现底部弹出列表选择器
  4. android中轮播图的实现
  5. Android(安卓)实现QQ第三方登录
  6. OpenCV自学笔记31. Android(安卓)上使用jni和opencv 实现边缘检
  7. Android(安卓)轻松实现语音朗读
  8. Android实现滑动标签页
  9. 浅谈Java中Collections.sort对List排序的两种方法

随机推荐

  1. Sql server 2005中output用法解析
  2. 整取整存,尽可能的减少SQL连接数.
  3. SQL查找条件语句构造类
  4. Oracle:从SQL文件批量导入数据
  5. sql2008中如何收缩数据库日志文件
  6. 当 IDENTITY_INSERT 设置为 OFF 时,不能为
  7. 在用apt源安装mysql-server时出现如下错
  8. pl/sql数据插入出现中文乱码问题
  9. 如何将行转换为列
  10. SQLyog Enterprise强制Copy表结构给本身