文档章节

Android开发 Android三种播放视频的方式

峰易
 峰易
发布于 2016/12/28 15:43
字数 866
阅读 16
收藏 0

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

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

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

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

 

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

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来实现:

 

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:

 

 

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 VideoSurfaceDemo extends Activity implements OnCompletionListener,OnErrorListener,OnInfoListener,  
        OnPreparedListener, OnSeekCompleteListener,OnVideoSizeChangedListener,SurfaceHolder.Callback{  
        private Display currDisplay;  
        private SurfaceView surfaceView;  
        private SurfaceHolder holder;  
        private MediaPlayer player;  
        private int vWidth,vHeight;  
        //private boolean readyToPlay = false;  
              
        public void onCreate(Bundle savedInstanceState){  
            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(SurfaceHolder arg0, int arg1, int arg2, int arg3) {  
            // 当Surface尺寸等参数改变时触发  
            Log.v("Surface Change:::", "surfaceChanged called");  
        }  
        @Override  
        public void surfaceCreated(SurfaceHolder holder) {  
            // 当SurfaceView中的Surface被创建的时候被调用  
            //在这里我们指定MediaPlayer在当前的Surface中进行播放  
            player.setDisplay(holder);  
            //在指定了MediaPlayer播放的容器后,我们就可以使用prepare或者prepareAsync来准备播放了  
            player.prepareAsync();  
              
        }  
        @Override  
        public void surfaceDestroyed(SurfaceHolder holder) {  
              
            Log.v("Surface Destory:::", "surfaceDestroyed called");  
        }  
        @Override  
        public void onVideoSizeChanged(MediaPlayer arg0, int arg1, int arg2) {  
            // 当video大小改变时触发  
            //这个方法在设置player的source后至少触发一次  
            Log.v("Video Size Change", "onVideoSizeChanged called");  
              
        }  
        @Override  
        public void onSeekComplete(MediaPlayer arg0) {  
            // seek操作完成时触发  
            Log.v("Seek Completion", "onSeekComplete called");  
              
        }  
        @Override  
        public void onPrepared(MediaPlayer player) {  
            // 当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(MediaPlayer player, 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(MediaPlayer player, 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(MediaPlayer player) {  
            // 当MediaPlayer播放完成后触发  
            Log.v("Play Over:::", "onComletion called");  
            this.finish();  
        }  
    }

 

感兴趣的加我qq或者微信:1524447071

© 著作权归作者所有

峰易
粉丝 1
博文 16
码字总数 13133
作品 0
杭州
程序员
私信 提问
通过webview打开HTML5页面用自己的浏览器点直播MP4和M3U8

如标题所示,借用webview的功用,我们可以快速的开发一款功能不是太多的视频点直播客户端 但是由于android 对HTML5种Video标签支持的不怎么友好,所以在不用android 浏览器(处理videod的类 ...

貌似高手
2012/06/18
0
1
Android使用VideoView播放网络视频

Android使用VideoView播放网络视频 Android支持播放网络上的视频。在播放网络上的视频时,牵涉到视频流的传输,往往有两种协议,一种是HTTP,一种是RTSP。这 两种协议最大的不同是,HTTP协议...

rainy86
2014/07/07
0
0
手把手教你做视频播放器(七)-横屏的播放界面与开放视频播放功能(完)

版权声明:本文为博主原创文章,禁止转载,违者必究。 https://blog.csdn.net/anddlecn/article/details/51523240 第8节 横屏的播放界面 在设备旋转成横屏的时候,视频将自动进行全屏播放。 ...

anddlecn
2016/05/28
0
0
一起学Android之ProgressBar

本文简述在Android开发中进度条(ProgressBar)的常见应用,仅供学习分享使用。 概述 在Android开发中,进度条的使用场景有很多,如播放电影时可拖动的观看进度条,评分时使用的评分条,上传下...

Alan.hsiang
01/05
0
0
Android多人视频聊天应用的开发(三)多人聊天

在上一篇《Android多人视频聊天应用的开发(二)一对一聊天》中我们学习了如何使用声网Agora SDK进行一对一的聊天,本篇主要讨论如何使用Agora SDK进行多人聊天。主要需要实现以下功能: 1、...

东风玖哥
2018/04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
5
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
5
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
15
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部