转至:http://blog.csdn.net/itachi85/article/details/7216962

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

1、使用其自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。

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

3、使用MediaPlayer类和SurfaceView来实现,这种方式很灵活。


1、调用其自带的播放器:

[java] view plain copy print ?
  1. Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v");     
  2. //调用系统自带的播放器     
  3.     Intent intent = new Intent(Intent.ACTION_VIEW);    
  4.     Log.v("URI:::::::::", uri.toString());    
  5.     intent.setDataAndType(uri, "video/mp4");    
  6.     startActivity(intent);    
    Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v");       //调用系统自带的播放器          Intent intent = new Intent(Intent.ACTION_VIEW);          Log.v("URI:::::::::", uri.toString());          intent.setDataAndType(uri, "video/mp4");          startActivity(intent);  

2、使用VideoView来实现:

[java] view plain copy print ?
  1. Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v");    
  2. VideoView videoView = (VideoView)this.findViewById(R.id.video_view);    
  3. videoView.setMediaController(new MediaController(this));    
  4. videoView.setVideoURI(uri);    
  5. videoView.start();    
  6. videoView.requestFocus();    
    Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v");      VideoView videoView = (VideoView)this.findViewById(R.id.video_view);      videoView.setMediaController(new MediaController(this));      videoView.setVideoURI(uri);      videoView.start();      videoView.requestFocus();  

3、使用MediaPlayer:

[java] view plain copy print ?
  1. package demo.camera;    
  2. import java.io.IOException;    
  3. import android.app.Activity;    
  4. import android.media.MediaPlayer;    
  5. import android.media.MediaPlayer.OnCompletionListener;    
  6. import android.media.MediaPlayer.OnErrorListener;    
  7. import android.media.MediaPlayer.OnInfoListener;    
  8. import android.media.MediaPlayer.OnPreparedListener;    
  9. import android.media.MediaPlayer.OnSeekCompleteListener;    
  10. import android.media.MediaPlayer.OnVideoSizeChangedListener;    
  11. import android.os.Bundle;    
  12. import android.os.Environment;    
  13. import android.util.Log;    
  14. import android.view.Display;    
  15. import android.view.SurfaceHolder;    
  16. import android.view.SurfaceView;    
  17. import android.widget.LinearLayout;    
  18. /**  
  19.  * 该实例中使用MediaPlayer完成播放,同时界面使用SurfaceView来实现  
  20.  *   
  21.  * 这里我们实现MediaPlayer中很多状态变化时的监听器  
  22.  *   
  23.  * 使用Mediaplayer时,也可以使用MediaController类,但是需要实现MediaController.mediaController接口  
  24.  * 实现一些控制方法。  
  25.  *   
  26.  * 然后,设置controller.setMediaPlayer(),setAnchorView(),setEnabled(),show()就可以了,这里不再实现  
  27.  * @author Administrator  
  28.  *  
  29.  */    
  30. public class VideoSurfaceDemo extends Activity implements OnCompletionListener,OnErrorListener,OnInfoListener,    
  31.     OnPreparedListener, OnSeekCompleteListener,OnVideoSizeChangedListener,SurfaceHolder.Callback{    
  32.     private Display currDisplay;    
  33.     private SurfaceView surfaceView;    
  34.     private SurfaceHolder holder;    
  35.     private MediaPlayer player;    
  36.     private int vWidth,vHeight;    
  37.     //private boolean readyToPlay = false;    
  38.             
  39.     public void onCreate(Bundle savedInstanceState){    
  40.         super.onCreate(savedInstanceState);    
  41.         this.setContentView(R.layout.video_surface);    
  42.                     
  43.         surfaceView = (SurfaceView)this.findViewById(R.id.video_surface);    
  44.         //给SurfaceView添加CallBack监听     
  45.         holder = surfaceView.getHolder();    
  46.         holder.addCallback(this);    
  47.         //为了可以播放视频或者使用Camera预览,我们需要指定其Buffer类型    
  48.         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    
  49.             
  50.         //下面开始实例化MediaPlayer对象     
  51.         player = new MediaPlayer();    
  52.         player.setOnCompletionListener(this);    
  53.         player.setOnErrorListener(this);    
  54.         player.setOnInfoListener(this);    
  55.         player.setOnPreparedListener(this);    
  56.         player.setOnSeekCompleteListener(this);    
  57.         player.setOnVideoSizeChangedListener(this);    
  58.         Log.v("Begin:::""surfaceDestroyed called");    
  59.         //然后指定需要播放文件的路径,初始化MediaPlayer    
  60.         String dataPath = Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v";    
  61.         try {    
  62.             player.setDataSource(dataPath);    
  63.             Log.v("Next:::""surfaceDestroyed called");    
  64.         } catch (IllegalArgumentException e) {    
  65.             e.printStackTrace();    
  66.         } catch (IllegalStateException e) {    
  67.             e.printStackTrace();    
  68.         } catch (IOException e) {    
  69.             e.printStackTrace();    
  70.         }    
  71.         //然后,我们取得当前Display对象    
  72.         currDisplay = this.getWindowManager().getDefaultDisplay();    
  73.     }    
  74.         
  75.     @Override    
  76.     public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {    
  77.         // 当Surface尺寸等参数改变时触发    
  78.         Log.v("Surface Change:::""surfaceChanged called");    
  79.     }    
  80.     @Override    
  81.     public void surfaceCreated(SurfaceHolder holder) {    
  82.         // 当SurfaceView中的Surface被创建的时候被调用    
  83.         //在这里我们指定MediaPlayer在当前的Surface中进行播放    
  84.         player.setDisplay(holder);    
  85.         //在指定了MediaPlayer播放的容器后,我们就可以使用prepare或者prepareAsync来准备播放了    
  86.         player.prepareAsync();    
  87.             
  88.     }    
  89.     @Override    
  90.     public void surfaceDestroyed(SurfaceHolder holder) {    
  91.             
  92.         Log.v("Surface Destory:::""surfaceDestroyed called");    
  93.     }    
  94.     @Override    
  95.     public void onVideoSizeChanged(MediaPlayer arg0, int arg1, int arg2) {    
  96.         // 当video大小改变时触发     
  97.         //这个方法在设置player的source后至少触发一次    
  98.         Log.v("Video Size Change""onVideoSizeChanged called");    
  99.             
  100.     }    
  101.     @Override    
  102.     public void onSeekComplete(MediaPlayer arg0) {    
  103.         // seek操作完成时触发     
  104.         Log.v("Seek Completion""onSeekComplete called");    
  105.             
  106.     }    
  107.     @Override    
  108.     public void onPrepared(MediaPlayer player) {    
  109.         // 当prepare完成后,该方法触发,在这里我们播放视频    
  110.             
  111.         //首先取得video的宽和高     
  112.         vWidth = player.getVideoWidth();    
  113.         vHeight = player.getVideoHeight();    
  114.             
  115.         if(vWidth > currDisplay.getWidth() || vHeight > currDisplay.getHeight()){    
  116.             //如果video的宽或者高超出了当前屏幕的大小,则要进行缩放    
  117.             float wRatio = (float)vWidth/(float)currDisplay.getWidth();    
  118.             float hRatio = (float)vHeight/(float)currDisplay.getHeight();    
  119.                 
  120.             //选择大的一个进行缩放     
  121.             float ratio = Math.max(wRatio, hRatio);    
  122.                 
  123.             vWidth = (int)Math.ceil((float)vWidth/ratio);    
  124.             vHeight = (int)Math.ceil((float)vHeight/ratio);    
  125.                 
  126.             //设置surfaceView的布局参数     
  127.             surfaceView.setLayoutParams(new LinearLayout.LayoutParams(vWidth, vHeight));    
  128.                 
  129.             //然后开始播放视频     
  130.                 
  131.             player.start();    
  132.         }    
  133.     }    
  134.     @Override    
  135.     public boolean onInfo(MediaPlayer player, int whatInfo, int extra) {    
  136.         // 当一些特定信息出现或者警告时触发     
  137.         switch(whatInfo){    
  138.         case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:    
  139.             break;    
  140.         case MediaPlayer.MEDIA_INFO_METADATA_UPDATE:      
  141.             break;    
  142.         case MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:    
  143.             break;    
  144.         case MediaPlayer.MEDIA_INFO_NOT_SEEKABLE:     
  145.             break;    
  146.         }    
  147.         return false;    
  148.     }    
  149.     @Override    
  150.     public boolean onError(MediaPlayer player, int whatError, int extra) {    
  151.         Log.v("Play Error:::""onError called");    
  152.         switch (whatError) {    
  153.         case MediaPlayer.MEDIA_ERROR_SERVER_DIED:    
  154.             Log.v("Play Error:::""MEDIA_ERROR_SERVER_DIED");    
  155.             break;    
  156.         case MediaPlayer.MEDIA_ERROR_UNKNOWN:    
  157.             Log.v("Play Error:::""MEDIA_ERROR_UNKNOWN");    
  158.             break;    
  159.         default:    
  160.             break;    
  161.         }    
  162.         return false;    
  163.     }    
  164.     @Override    
  165.     public void onCompletion(MediaPlayer player) {    
  166.         // 当MediaPlayer播放完成后触发     
  167.         Log.v("Play Over:::""onComletion called");    
  168.         this.finish();    
  169.     }    
  170. }    

更多相关文章

  1. Android(安卓)- 事件模型
  2. 视频播放器videoview surfaceview
  3. android的事件分发
  4. 使用MediaPlayer播放音乐文件
  5. android MediaPlayer和VideoView的使用
  6. 如何在iPhone的后台播放视频?
  7. 安卓 简易版音乐播放器——初稿
  8. 播放raw中的音乐范例
  9. MediaTest

随机推荐

  1. Android(安卓)APIDemo gif图片显示
  2. Android加载html实现文件上传功能
  3. Android之Spinner用法
  4. 理解Android(安卓)UI线程
  5. android 动画2
  6. Android(安卓)P新特性:强制执行 FLAG_ACT
  7. Android登录界面开发及响应;页面跳转;传参
  8. android proguard
  9. android density
  10. Android(安卓)学习记录-调试输出