zoukankan      html  css  js  c++  java
  • Android三种播放视频的方式

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

    1、使用其自带的播放器。指定ActionACTION_VIEW,DataUriType为其MIME类型。

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

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

       

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

    ?

    1

    2

    3

    4

    5

    6

    Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v");  

    //调用系统自带的播放器 

        Intent intent = newIntent(Intent.ACTION_VIEW); 

        Log.v("URI:::::::::", uri.toString()); 

        intent.setDataAndType(uri, "video/mp4"); 

        startActivity(intent);

     

    2、使用VideoView来实现:

    ?

    1

    2

    3

    4

    5

    6

    Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v"); 

    VideoView videoView = (VideoView)this.findViewById(R.id.video_view); 

    videoView.setMediaController(newMediaController(this)); 

    videoView.setVideoURI(uri); 

    videoView.start(); 

    videoView.requestFocus();


    3
    、使用MediaPlayer

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

    99

    100

    101

    102

    103

    104

    105

    106

    107

    108

    109

    110

    111

    112

    113

    114

    115

    116

    117

    118

    119

    120

    121

    122

    123

    124

    125

    126

    127

    128

    129

    130

    131

    132

    133

    134

    135

    136

    137

    138

    139

    140

    141

    142

    143

    144

    145

    146

    147

    148

    149

    150

    151

    152

    153

    154

    155

    156

    157

    158

    159

    160

    161

    162

    163

    164

    165

    166

    167

    168

    169

    170

    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

     *

     */ 

    publicclassVideoSurfaceDemo extendsActivity implementsOnCompletionListener,OnErrorListener,OnInfoListener, 

        OnPreparedListener, OnSeekCompleteListener,OnVideoSizeChangedListener,SurfaceHolder.Callback{ 

        privateDisplay currDisplay; 

        privateSurfaceView surfaceView; 

        privateSurfaceHolder holder; 

        privateMediaPlayer player; 

        privateintvWidth,vHeight; 

        //private boolean readyToPlay = false; 

                 

        publicvoidonCreate(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 = 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 

            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 

        publicvoidsurfaceChanged(SurfaceHolder arg0, intarg1, intarg2, intarg3) { 

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

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

        } 

        @Override 

        publicvoidsurfaceCreated(SurfaceHolder holder) { 

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

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

            player.setDisplay(holder); 

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

            player.prepareAsync(); 

                 

        } 

        @Override 

        publicvoidsurfaceDestroyed(SurfaceHolder holder) { 

                 

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

        } 

        @Override 

        publicvoidonVideoSizeChanged(MediaPlayer arg0, intarg1, intarg2) { 

            // 当video大小改变时触发 

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

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

                 

        } 

        @Override 

        publicvoidonSeekComplete(MediaPlayer arg0) { 

            // seek操作完成时触发 

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

                 

        } 

        @Override 

        publicvoidonPrepared(MediaPlayer player) { 

            // 当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(MediaPlayer player, 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(MediaPlayer player, 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(MediaPlayer player) { 

            // 当MediaPlayer播放完成后触发 

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

            this.finish(); 

        } 

    }

     
  • 相关阅读:
    Ubuntu 安装 NTP 服务
    Packer 如何将 JSON 的配置升级为 HCL2
    WinRM 如何设置 TrustedHosts
    Windows 10 如何设置网络属性为私有
    Windows 使用 PowerShell 来管理另外一台 Windows 机器
    Windows PowerShell ISE 是什么和 PowerShell 有什么区别
    Spring事务传播属性和隔离级别
    @SpringBootApplication(exclude={DataSourceAutoConfiguration.class})注解作用
    杂文 | 如何在演讲中讲个好故事
    2.2 思考框架:什么样的代码才是高效的代码
  • 原文地址:https://www.cnblogs.com/Yellow0-0River/p/4242774.html
Copyright © 2011-2022 走看看