Android视频播放总结: 三种播放视频的方式

更多资料: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 = newIntent(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(newMediaController(this));    

videoView.setVideoURI(uri);    

videoView.start();    

videoView.requestFocus();


3、使用MediaPlayer:


packagedemo.camera;    

importjava.io.IOException;    

importandroid.app.Activity;    

importandroid.media.MediaPlayer;    

importandroid.media.MediaPlayer.OnCompletionListener;    

importandroid.media.MediaPlayer.OnErrorListener;    

importandroid.media.MediaPlayer.OnInfoListener;    

importandroid.media.MediaPlayer.OnPreparedListener;    

importandroid.media.MediaPlayer.OnSeekCompleteListener;    

importandroid.media.MediaPlayer.OnVideoSizeChangedListener;    

importandroid.os.Bundle;    

importandroid.os.Environment;    

importandroid.util.Log;    

importandroid.view.Display;    

importandroid.view.SurfaceHolder;    

importandroid.view.SurfaceView;    

importandroid.widget.LinearLayout;    

/**  

* 该实例中使用MediaPlayer完成播放,同时界面使用SurfaceView来实现  

*  

* 这里我们实现MediaPlayer中很多状态变化时的监听器  

*  

* 使用Mediaplayer时,也可以使用MediaController类,但是需要实现MediaController.mediaController接口  

* 实现一些控制方法。  

*  

* 然后,设置controller.setMediaPlayer(),setAnchorView(),setEnabled(),show()就可以了,这里不再实现  

* @author Administrator  

*  

*/    

publicclassVideoSurfaceDemoextendsActivityimplementsOnCompletionListener,OnErrorListener,OnInfoListener,    

    OnPreparedListener,OnSeekCompleteListener,OnVideoSizeChangedListener,SurfaceHolder.Callback{    

    privateDisplaycurrDisplay;    

    privateSurfaceViewsurfaceView;    

    privateSurfaceHolderholder;    

    privateMediaPlayerplayer;    

    privateintvWidth,vHeight;    

    //private boolean readyToPlay = false;    

            

    publicvoidonCreate(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 = newMediaPlayer();    

        player.setOnCompletionListener(this);    

        player.setOnErrorListener(this);    

        player.setOnInfoListener(this);    

        player.setOnPreparedListener(this);    

        player.setOnSeekCompleteListener(this);    

        player.setOnVideoSizeChangedListener(this);    

        Log.v("Begin:::","surfaceDestroyed called");    

        //然后指定需要播放文件的路径,初始化MediaPlayer    

        StringdataPath = Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v";    

        try{    

            player.setDataSource(dataPath);    

            Log.v("Next:::","surfaceDestroyed called");    

        }catch(IllegalArgumentExceptione){    

            e.printStackTrace();    

        }catch(IllegalStateExceptione){    

            e.printStackTrace();    

        }catch(IOExceptione){    

            e.printStackTrace();    

        }    

        //然后,我们取得当前Display对象    

        currDisplay = this.getWindowManager().getDefaultDisplay();    

    }    

        

    @Override    

    publicvoidsurfaceChanged(SurfaceHolderarg0,intarg1,intarg2,intarg3){    

        // 当Surface尺寸等参数改变时触发    

        Log.v("Surface Change:::","surfaceChanged called");    

    }    

    @Override    

    publicvoidsurfaceCreated(SurfaceHolderholder){    

        // 当SurfaceView中的Surface被创建的时候被调用    

        //在这里我们指定MediaPlayer在当前的Surface中进行播放    

        player.setDisplay(holder);    

        //在指定了MediaPlayer播放的容器后,我们就可以使用prepare或者prepareAsync来准备播放了    

        player.prepareAsync();    

            

    }    

    @Override    

    publicvoidsurfaceDestroyed(SurfaceHolderholder){    

            

        Log.v("Surface Destory:::","surfaceDestroyed called");    

    }    

    @Override    

    publicvoidonVideoSizeChanged(MediaPlayerarg0,intarg1,intarg2){    

        // 当video大小改变时触发    

        //这个方法在设置player的source后至少触发一次    

        Log.v("Video Size Change","onVideoSizeChanged called");    

            

    }    

    @Override    

    publicvoidonSeekComplete(MediaPlayerarg0){    

        // seek操作完成时触发    

        Log.v("Seek Completion","onSeekComplete called");    

            

    }    

    @Override    

    publicvoidonPrepared(MediaPlayerplayer){    

        // 当prepare完成后,该方法触发,在这里我们播放视频    

            

        //首先取得video的宽和高    

        vWidth = player.getVideoWidth();    

        vHeight = player.getVideoHeight();    

            

        if(vWidth > currDisplay.getWidth() || vHeight > currDisplay.getHeight()){    

            //如果video的宽或者高超出了当前屏幕的大小,则要进行缩放    

            floatwRatio = (float)vWidth/(float)currDisplay.getWidth();    

            floathRatio = (float)vHeight/(float)currDisplay.getHeight();    

                

            //选择大的一个进行缩放    

            floatratio = Math.max(wRatio,hRatio);    

                

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

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

                

            //设置surfaceView的布局参数    

            surfaceView.setLayoutParams(newLinearLayout.LayoutParams(vWidth,vHeight));    

                

            //然后开始播放视频    

                

            player.start();    

        }    

    }    

    @Override    

    publicbooleanonInfo(MediaPlayerplayer,intwhatInfo,intextra){    

        // 当一些特定信息出现或者警告时触发    

        switch(whatInfo){    

        caseMediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:    

            break;    

        caseMediaPlayer.MEDIA_INFO_METADATA_UPDATE:      

            break;    

        caseMediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:    

            break;    

        caseMediaPlayer.MEDIA_INFO_NOT_SEEKABLE:    

            break;    

        }    

        returnfalse;    

    }    

    @Override    

    publicbooleanonError(MediaPlayerplayer,intwhatError,intextra){    

        Log.v("Play Error:::","onError called");    

        switch(whatError){    

        caseMediaPlayer.MEDIA_ERROR_SERVER_DIED:    

            Log.v("Play Error:::","MEDIA_ERROR_SERVER_DIED");    

            break;    

        caseMediaPlayer.MEDIA_ERROR_UNKNOWN:    

            Log.v("Play Error:::","MEDIA_ERROR_UNKNOWN");    

            break;    

        default:    

            break;    

        }    

        returnfalse;    

    }    

    @Override    

    publicvoidonCompletion(MediaPlayerplayer){    

        // 当MediaPlayer播放完成后触发    

        Log.v("Play Over:::","onComletion called");    

        this.finish();    

    }    

}


关于Java和Android大牛频道

Java和Android大牛频道是一个数万人关注的探讨Java和Android开发的公众号,分享和原创最有价值的干货文章,让你成为这方面的大牛

我们探讨android和Java开发最前沿的技术:android性能优化 ,插件化,动态化,跨平台,动态化,加固和反破解等,也讨论设计模式/软件架构等。由群来自BAT的工程师组成的团队

关注即送红包,回复:“百度” 、“阿里”、“腾讯” 有惊喜!!!关注后可用入微信群。群里都是来自百度阿里腾讯的大牛。

欢迎关注我们,一起讨论技术,扫描和长按下方的二维码可快速关注我们。搜索微信公众号:JANiubility。


公众号:JANiubility

如想加群讨论学习,请关注微信公众号点击右下角的“加群学习”菜单入群。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值