Android播放视频的三种方式

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

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

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

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

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

Uriuri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v");
//调用系统自带的播放器
 Intentintent = new Intent(Intent.ACTION_VIEW);
 Log.v("URI:::::::::", uri.toString());
 intent.setDataAndType(uri, "video/mp4");
 startActivity(intent);

2、使用VideoView来实现:

Uriuri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v");
VideoViewvideoView = (VideoView)this.findViewById(R.id.video_view);
videoView.setMediaController(new MediaController(this));
videoView.setVideoURI(uri);
videoView.start();
videoView.requestFocus();

3、使用MediaPlayer:

package demo.camera;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnInfoListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnSeekCompleteListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.LinearLayout;
/**
* 该实例中使用MediaPlayer完成播放,同时界面使用SurfaceView来实现
*
* 这里我们实现MediaPlayer中很多状态变化时的监听器
*
* 使用Mediaplayer时,也可以使用MediaController类,但是需要实现MediaController.mediaController接口
* 实现一些控制方法。
*
* 然后,设置controller.setMediaPlayer(),setAnchorView(),setEnabled(),show()就可以了,这里不再实现
* @author Administrator
*
*/
public class VideoSurfaceDemoextends Activityimplements OnCompletionListener,OnErrorListener,OnInfoListener,
 OnPreparedListener, OnSeekCompleteListener,OnVideoSizeChangedListener,SurfaceHolder.Callback{
 private DisplaycurrDisplay;
 private SurfaceViewsurfaceView;
 private SurfaceHolderholder;
 private MediaPlayerplayer;
 private int vWidth,vHeight;
 //private boolean readyToPlay = false; 

 public void onCreate(BundlesavedInstanceState){
  super.onCreate(savedInstanceState);
  this.setContentView(R.layout.video_surface); 

  surfaceView = (SurfaceView)this.findViewById(R.id.video_surface);
  //给SurfaceView添加CallBack监听
  holder = surfaceView.getHolder();
  holder.addCallback(this);
  //为了可以播放视频或者使用Camera预览,我们需要指定其Buffer类型
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

  //下面开始实例化MediaPlayer对象
  player = new MediaPlayer();
  player.setOnCompletionListener(this);
  player.setOnErrorListener(this);
  player.setOnInfoListener(this);
  player.setOnPreparedListener(this);
  player.setOnSeekCompleteListener(this);
  player.setOnVideoSizeChangedListener(this);
  Log.v("Begin:::", "surfaceDestroyed called");
  //然后指定需要播放文件的路径,初始化MediaPlayer
  String dataPath = Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v";
  try {
   player.setDataSource(dataPath);
   Log.v("Next:::", "surfaceDestroyed called");
  } catch (IllegalArgumentException e) {
   e.printStackTrace();
  } catch (IllegalStateException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  //然后,我们取得当前Display对象
  currDisplay = this.getWindowManager().getDefaultDisplay();
 } 

 @Override
 public void surfaceChanged(SurfaceHolderarg0, int arg1, int arg2, int arg3) {
  // 当Surface尺寸等参数改变时触发
  Log.v("Surface Change:::", "surfaceChanged called");
 }
 @Override
 public void surfaceCreated(SurfaceHolderholder) {
  // 当SurfaceView中的Surface被创建的时候被调用
  //在这里我们指定MediaPlayer在当前的Surface中进行播放
  player.setDisplay(holder);
  //在指定了MediaPlayer播放的容器后,我们就可以使用prepare或者prepareAsync来准备播放了
  player.prepareAsync(); 

 }
 @Override
 public void surfaceDestroyed(SurfaceHolderholder) { 

  Log.v("Surface Destory:::", "surfaceDestroyed called");
 }
 @Override
 public void onVideoSizeChanged(MediaPlayerarg0, int arg1, int arg2) {
  // 当video大小改变时触发
  //这个方法在设置player的source后至少触发一次
  Log.v("Video Size Change", "onVideoSizeChanged called"); 

 }
 @Override
 public void onSeekComplete(MediaPlayerarg0) {
  // seek操作完成时触发
  Log.v("Seek Completion", "onSeekComplete called"); 

 }
 @Override
 public void onPrepared(MediaPlayerplayer) {
  // 当prepare完成后,该方法触发,在这里我们播放视频 

  //首先取得video的宽和高
  vWidth = player.getVideoWidth();
  vHeight = player.getVideoHeight(); 

  if(vWidth > currDisplay.getWidth() || vHeight > currDisplay.getHeight()){
   //如果video的宽或者高超出了当前屏幕的大小,则要进行缩放
   float wRatio = (float)vWidth/(float)currDisplay.getWidth();
   float hRatio = (float)vHeight/(float)currDisplay.getHeight(); 

   //选择大的一个进行缩放
   float ratio = Math.max(wRatio, hRatio); 

   vWidth = (int)Math.ceil((float)vWidth/ratio);
   vHeight = (int)Math.ceil((float)vHeight/ratio); 

   //设置surfaceView的布局参数
   surfaceView.setLayoutParams(new LinearLayout.LayoutParams(vWidth, vHeight)); 

   //然后开始播放视频 

   player.start();
  }
 }
 @Override
 public boolean onInfo(MediaPlayerplayer, int whatInfo, int extra) {
  // 当一些特定信息出现或者警告时触发
  switch(whatInfo){
  case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:
   break;
  case MediaPlayer.MEDIA_INFO_METADATA_UPDATE:
   break;
  case MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:
   break;
  case MediaPlayer.MEDIA_INFO_NOT_SEEKABLE:
   break;
  }
  return false;
 }
 @Override
 public boolean onError(MediaPlayerplayer, int whatError, int extra) {
  Log.v("Play Error:::", "onError called");
  switch (whatError) {
  case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
   Log.v("Play Error:::", "MEDIA_ERROR_SERVER_DIED");
   break;
  case MediaPlayer.MEDIA_ERROR_UNKNOWN:
   Log.v("Play Error:::", "MEDIA_ERROR_UNKNOWN");
   break;
  default:
   break;
  }
  return false;
 }
 @Override
 public void onCompletion(MediaPlayerplayer) {
  // 当MediaPlayer播放完成后触发
  Log.v("Play Over:::", "onComletion called");
  this.finish();
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android提高之MediaPlayer音视频播放

    前面文章已经详细介绍了Android界面的入门技术,相信大家在看完和跟着练习之后,会对于常用的Layout和View都会有一定的了解了,接下来就不再强调介绍界面了,而是针对具体的常见功能而展开. 本文将介绍MediaPlayer的使用.MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,这需要视情况选择.MediaPlayer播放音频比较简单,但是要播放视频就需要Sur

  • Android提高之MediaPlayer播放网络视频的实现方法

    前面讲解了MediaPlayer播放网络音频,主要介绍了MediaPlayer关于网络音频的缓冲和进度条控制的方法,本文再来讲解一下MediaPlayer播放网络视频的方法.播放网络视频比播放网络音频需要多一个SurfaceView而已,在已经熟悉了MediaPlayer播放网络音频之后,相信大家对本文所述的播放网络视频也能很快地掌握. 先来看看本文程序运行截图,如下所示: 本文程序的视频来自http://daily3gp.com,大家可以替换程序中的视频链接,试试其他影片. main.xml的

  • Android 使用Vitamio打造自己的万能播放器(10)—— 本地播放 (缩略图、视频信息、视频扫描服务)

    前言 Vitamio是我们团队的诚意之作,除了要将VPlayer打造成Android最好的播放器,也要将Vitamio打造成Android最好的播放器组件.新版发布内测SDK虽然还有一些问题,但已经具备高可扩展性.便捷性和许多内置实用的功能,后续文章将继续深挖和介绍Vitamio的使用细节和方法.本章将提供显示缩略图.视频大小等视频信息,并介绍使用Vitamio内置的ContentProvider以及文件扫描服务. 注意 本章ContentProvider在2012-8-31发布的SDK中已经不

  • Android编程视频播放API之MediaPlayer用法示例

    本文实例讲述了Android编程视频播放API之MediaPlayer用法.分享给大家供大家参考,具体如下: 现在项目要做音视频这块功能,这正是我相对比较薄弱的地方,项目中要用到,赶紧抓紧时间学习.前面有一编介绍不错的文章http://www.jb51.net/article/121881.htm,值得学习. 这里给出一个较为简单的示例: /** * Android API MediaPlayer示例 * * @description: * @author ldm * @date 2016-4-

  • Android自定义SeekBar实现视频播放进度条

    首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb,在Thumb正上方有一个PopupWindow窗口,窗口里面显示当前的播放时间.在SeekBar右边有一个文本框显示当前播放时间/总时间. step1.先来看一看PopupWindow的布局文件,seek_popu.xml,效果如下图所示: <?xml version="1.0" encoding="utf-8"?> <RelativeLa

  • android使用videoview播放视频

    复制代码 代码如下: public class Activity01 extends Activity{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState); setContentView(R.layout.main); final VideoView vid

  • Android使用VideoView播放本地视频和网络视频的方法

    1.效果展示 2.布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="matc

  • Android仿新浪微博/QQ空间滑动自动播放视频功能

    先来看看效果图 关键代码 1.监听滚动事件 首先要给listview添加setOnScrollListener监听,注意这个监听在recyclerView上是addOnScrollListener,也就是说下面代码同时支持recyclerView. public int firstVisible=0,visibleCount=0, totalCount=0; videoList.setOnScrollListener(new AbsListView.OnScrollListener() { @O

  • android webvie指定视频播放器播放网站视频

    过滤掉其他的播放器,使用我自己的播放器来做 复制代码 代码如下: wv.setWebViewClient(new WebViewClient() {            public boolean shouldOverrideUrlLoading(final WebView view,                    final String url) { if (url.contains("3gp") || url.contains("mp4")) {/

  • Android如何让WebView中的HTML5页面实现视频全屏播放

    前言 本文主要是将最近工作中遇到的一个问题进行总结分享,主要介绍的是如何让WebView中H5页面全屏播放视频.关于这个问题,做一下简单分析,希望对大家有所帮助,下面话不多说了,来看看详细的介绍吧. 效果图 运行效果 其实很简单,就是配置问题.关键地方配好了,基本没什么问题了. 硬件加速 设置WebView 在清单需要配置的AndroidManifest.xml <application android:allowBackup="true" android:icon="

  • 详解Android App中使用VideoView来实现视频播放的方法

    通过VideoView播放视频的步骤: 1.在界面布局文件中定义VideoView组件,或在程序中创建VideoView组件 2.调用VideoView的如下两个方法来加载指定的视频 (1)setVidePath(String path):加载path文件代表的视频 (2)setVideoURI(Uri uri):加载uri所对应的视频 3.调用VideoView的start().stop().psuse()方法来控制视频的播放 VideoView通过与MediaController类结合使用,

随机推荐