视频播放-VideoVIew,Vitamio

  • 播放视频文件其实并不比播放音频文件复杂,主要是使用 VideoView类来实现的。这个
    类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器。
    VideoView的用法和 MediaPlayer 也比较类似(不同点在于播放视频需要UI控件,播放音乐只需要借助MediaPlayer对象)

    VideoView,用于播放一段视频媒体,它继承了SurfaceView,位于"android.widget.VideoView",是一个视频控件

  • 常用监听:
  • setOnCompletionListener(MediaPlayer.onCompletionListener l):监听播放完成的事件。
  • setOnErrorListener(MediaPlayer.OnErrorListener l):监听播放发生错误时候的事件。
  • setOnPreparedListener(MediaPlayer.OnPreparedListener l)::监听视频装载完成的事件

xml布局:

<?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="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="fanggao.qf.videoview.MainActivity">

    <VideoView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="300dp" />
</RelativeLayout>
View Code

源代码:

/**
 * VideoView  surfaceView的子类
 */
public class MainActivity extends AppCompatActivity {
    private String url = "http://qiubai-video.qiushibaike.com/G2XQOKE9T0NKSX4E_3g.mp4";
    private VideoView videoView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获得videoView对象
        videoView = (VideoView) findViewById(R.id.video_view);
        //给video填充数据
        videoView.setVideoPath(url);
//        videoView.setVideoURI(Uri.parse(path));第二种方式
        //播放本地资源
//        videoView.setVideoPath(new File(Environment.getExternalStorageDirectory(),"a.mp3").getPath());

        /**媒体控制面版常用方法:MediaController:
         hide();     隐藏MediaController;
         show();     显示MediaController
         show(int timeout);设置MediaController显示的时间,以毫秒计算,如果设置为0则一直到调用hide()时隐藏;
         */
        //设置媒体控制器
        videoView.setMediaController(new MediaController(this));//设置该参数就有滑动条
        //设置准备监听
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
            public void onPrepared(MediaPlayer mp) {
               //视频播放器播放视频
                mp.start();
            }
    });
    }
    /*videoVIew.stopPlayback()内部的方法如下,
                  只是将媒体播放器停止并释放资源
                if (mMediaPlayer != null) {
                   mMediaPlayer.stop();
                   mMediaPlayer.release();
                   mMediaPlayer = null;
                   */
    /*如果需要播放完毕后播放下一个视频只需要调用videoView.stopPlayback(),后再重新调用VideoVIew.setVideoPath(path)即可
    * 而serfaceView 调用stop方法后将不能再播放视频*/
    @Override
    protected void onDestroy() {
        //在销毁活动之前调用该方法
        if(videoView != null){
            //释放资源
            videoView.stopPlayback();
            videoView = null;

        }
        super.onDestroy();

    }
}

可以看出,VideoView和MediaPlayer用法上很相似,其实是因为VideoView的内部封装了MediaPlayer,使得我们可以很方便的使用它,但是VideoView 并不是一个万能的视频播放工具类,它在视频格式的支持以及播放效率方面都存在着较大的不足,只适于播放一些游戏的片头动画,或者某个应用的视频宣传等.

另外,也有第三方的包Vitamio,帮助我们轻松的播放视频

vitamio,下载地址:https://www.vitamio.org/Download/    下载代码即可

使用方法跟VideoView基本一致

不过需要在清单文件中注册一个没有界面的Activity,还需要初始化

 下载后将vitamio当module文件导入-修改编译版本跟之前项目一致--最后当库文件导入当前项目中(Add as library)

没有页面的activity

<activity
            android:name="io.vov.vitamio.activity.InitActivity"
            android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
            android:launchMode="singleTop"
            android:theme="@android:style/Theme.NoTitleBar"
            android:windowSoftInputMode="stateAlwaysHidden"/>

xml文件:

<?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="match_parent"
    android:layout_height="match_parent"
    tools:context="fanggao.qf.vitamio.MainActivity">

 <io.vov.vitamio.widget.VideoView
     android:id="@+id/videoView"
     android:layout_width="match_parent"
     android:layout_height="match_parent" />
</RelativeLayout>

main函数:

public class MainActivity extends AppCompatActivity {
    //rtmp是直播的网络协议
    private String url="rtmp://live.hkstv.hk.lxdns.com/live/hks";
    private VideoView vView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //注册
        Vitamio.isInitialized(this);
        setContentView(R.layout.activity_main);

        vView = (VideoView) findViewById(R.id.videoView);
        //设置数据
         vView.setVideoPath(url);
        //设置控制器
        vView.setMediaController(new MediaController(this));
        //设置预加载完成后的监听
        vView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                vView.start();
            }
        });
}

    @Override
    protected void onDestroy() {
        if(vView != null){
            vView.stopPlayback();
            vView = null;
        }
        super.onDestroy();
    }
}

注意:rtmp是直播的网络协议

 效果:
直播中...

原文地址:https://www.cnblogs.com/fangg/p/5932961.html