专栏首页JarvanMo的IT专栏基于ExoPlayer的ExoVideoView

基于ExoPlayer的ExoVideoView

前言

本人之前写过一篇名为基于ExoPlayer的ExoPlayerVideoView的文章,近日发现竟然被盗用了。 今日再次发布本文是因为ExoVideoView升级啦,新版的更好用,支持更多功能,支持自定义controller。 特性

1.自动处理音频焦点。
2.根据传感器自动处理方向。
3.手势支持。
4.多清晰度选择支持。
5.为控制器添加自定义布局.
6.调整显示大小。
7.自定义controller。

使用 ExoVideoView

1.依赖

最简单的方式是加入gradle依赖。请确认在工程的build.gradle中添加了JCenter和google()。

repositories {
    jcenter()
    google()
}

然后在你的项目中添加如下代码:

implementation 'com.jarvanmo:exoplayerview:2.0.8'

2.在xml中定义

在xml中使用 ExoVideoView:

<com.jarvanmo.exoplayerview.ui.ExoVideoView
     android:id="@+id/videoView"
     android:layout_width="match_parent"
     android:layout_height="300dp"/>

3.在java代码中

ExoVideoView 提供了内建Player

SimpleMediaSource mediaSource = new SimpleMediaSource(url);//也支持uri
videoView.play(mediaSource);
videoView.play(mediaSource,where);//play from a particular position

也可以使用自义的Player:

videoView.setPlayer(player);

提示:不要忘记释放ExoPlayer:

videoView.releasePlayer();

详情请移步demo.

3.方向管理

ExoVideoView 可以自动处理方向问题,前提是为ExoVideoView设置一个OrientationListener:

    videoView.setOrientationListener(orientation -> {
            if (orientation == SENSOR_PORTRAIT) {
                //do something
            } else if (orientation == SENSOR_LANDSCAPE) {
                //do something
            }
        });

提示:当ExoVideoView自动处理方向问题时,如果在Controller中的context是Activity,那么系统会调用 activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE) or activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 全屏事件处理也是如此。

4返回管理

首先,重写onKeyDown:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            return videoView.onKeyDown(keyCode, event);
        }
        return super.onKeyDown(keyCode, event);
    }

为ExoVideoView设置监听:

    videoView.setBackListener((view, isPortrait) -> {
            if (isPortrait) {
              //do something
            }
            return false;
        });

如果返回值是 true, 系统后续动作会被中断.否则,ExoVideoView会自动处理方向,并且会回调OrientationLister.onOrientationChange() .

高级

1.多清清晰度

ExoVideoView 内置清晰度选择器.如果开启发多清晰度并添加了多清晰度,内置清晰度选择器将被加入overlayFrameLayout.

        List<ExoMediaSource.Quality> qualities = new ArrayList<>();
        ExoMediaSource.Quality quality =new SimpleQuality(quality,mediaSource.url());
        qualities.add(quality);
        mediaSource.setQualities(qualities);

2.Controller显示模式

ExoVideoPlaybackController 被分为四个部分:

1.Top
2.Top Landscape
3.Bottom
4.Bottom Landscape

每一部分都可以被显示或隐藏:

 app:controller_display_mode="all|none|top|top_landscape|bottom|bottom_landscape"

在java中:

  videoView.setControllerDisplayMode(mode);

3.为controller添加控件

ExoVideoPlaybackController 允许在java代码中添加控件.

  videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_TOP, view);
  videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_TOP_LANDSCAPE, view);
  videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_BOTTOM_LANDSCAPE, view);

4.使用自定义controller布局

exo_video_playback_control_view.xml是允许自定义的。其中一些属性在ExoVideoPlaybackControlView有定义。具体可看源码。

app:controller_layout_id="@layout/my_controller"

其他

  app:controller_background="@android:color/holo_orange_dark"
  app:use_artwork="true"
  app:default_artwork="@drawable/default_art"

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于ExoPlayer的ExoVideoView

    本人之前写过一篇名为基于ExoPlayer的ExoPlayerVideoView的文章,近日发现竟然被盗用了。

    JarvanMo
  • 基于ExoPlayer的ExoPlayerVideoView

    在Android设备中,播放视频和音乐是非常普遍的。Android框架提供了一个对于媒体的操作的最省代码的解决方案:MediaPlayer。它提供了低等级的媒体...

    JarvanMo
  • Android通过代码实现多语言切换

    最近接手一个Android项目,需要实现对维吾尔族语的支持。虽然做了这么久的android开发,只做过多语言支持,但做应用内部多语言支持还是第一次,而且还是对维...

    JarvanMo
  • 基于ExoPlayer的ExoVideoView

    本人之前写过一篇名为基于ExoPlayer的ExoPlayerVideoView的文章,近日发现竟然被盗用了。

    JarvanMo
  • python中的map()函数

    1.对可迭代函数'iterable'中的每一个元素应用‘function’方法,将结果作为list返回。 例:

    py3study
  • java基础07

    有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员

    待你如初见
  • IOS AVAudioPlayer 播放MP3

    用户5760343
  • Python标准库 - subproce

    编写Python脚本时, 经常要执行Linux操作系统命令, 如mkdir zzzz. 目前比较推荐的方法是使用subprocess模块.

    py3study
  • dotnet 用 Microsoft.Diagnostics.Runtime 库写代码解析 DUMP 文件

    在分析 DUMP 进行自动化调试的时候,很多时候只能通过 WinDbg 和命令行调用的方式,这样的方式很难做到灵活。同时编写各个命令行的难度也特别高,这在需要对...

    林德熙
  • 人工智能闪耀“互联网之光”

    昨日,由全球400余家企业参展的“互联网之光”博览会在世界互联网大会上演。博览会上,替老师批改作业的机器人、能识别唇语的智能识别系统、对着商品微笑就能获得打折优...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券