Android中VideoView及SurfaceView视频播放实现

来源:互联网 发布:手机word办公软件 编辑:程序博客网 时间:2024/05/17 06:30

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

原创粉丝点击