基于ExoPlayer的ExoPlayerVideoView

写在前面

在Android设备中,播放视频和音乐是非常普遍的。Android框架提供了一个对于媒体的操作的最省代码的解决方案:MediaPlayer。它提供了低等级的媒体API,例如:MediaCodecAudioTrackMediaDrm,可以用于建立自定义媒体播放的解决方案。 但是MediaPlayer的api实在是但太难用了,扩展性也不好。所以我们可以用诸如ijkplayer,VLC以及ExoPlayer。本文并不是讲述ExoPlayer如何使用的,而是一款基于ExoPlayer的VideoView。ExoPlayerVideoView旨在提供一个快捷的视频播放布局的解决方案。

概览

亮度调节

控制器

快进快退

横屏

竖屏

音量

开始

ExoPlayerView 是一个基于ExoPlayer的视频播放器,并且做了很多封装。 ExoPlayerView是在实际工作中的产物,可能并无法完全满足各位的实际工作中的要求,但可以借鉴下。

特性 1.提供了4种视频适应模式: fit , fit_width , fit_height 和 none。 2.自动处理音频焦点问题。 3.可以根据传感器自动处理视频方向问题。 4.支持简单的手势操作,如快进快退,调节音量。 用法

导入

build.gradle 中加入

compile 'com.jarvanmo:exoplayerview:1.0.0'

ExoPlayerView 可以直接播放如mp4,m3u8 等简单视频,可以用于直播. 在布局文件中引入 ExoVideoView:

    <com.jarvanmo.exoplayerview.ui.ExoVideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        app:useController="true"
        app:resizeMode="none"
        app:orientationAuto="true"
        />

Play 播放一个视频:

   videoView.play(mediaSource);

如果你直接调用了上面的方法,ExoVideoView可以自动创建ExoPlayer. 当然了, 你也可以自己创建ExoPlayer;

    videoView.setPlayer(player);

也可以从指定位置播放:

   videoView.play(mediaSource,where);

注意:不要忘记释放ExoPlayer:

videoView.releaseSelfPlayer();

可以通过如下方式为视频设置一个显示名称:

 mediaSource.setDisplayName("LuYu YouYue");

或者

 videoView.setDisplayName("LuYu YouYue");

管理ExoVideoView方向

如果你为ExoVideoView设置了一个非空OrientationListener,ExoVideoView可以通过感器自动 变换方向。

      videoView.setOrientationListener(new ExoVideoPlaybackControlView.OrientationListener() {
            @Override
            public void onOrientationChange(@ExoVideoPlaybackControlView.SensorOrientationType int orientation) {
                if(orientation == SENSOR_PORTRAIT){
                    changeToPortrait();
                }else if(orientation == SENSOR_LANDSCAPE){
                    changeToLandscape();
                }
            }
        });

只有当在controller中的context是Activity的时候,ExoVideoView才会调用:activity.setRequestedOrientation() 全屏按钮也是如此。 也可以通过如下方式更改ExoVideoView方向:

videoView.toggleControllerOrientation();

或者

videoView.setPortrait(true);

处理返回事件

在activity:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){

            if(videoView.isPortrait()){
               finish();
                return false;
            }else {
                videoView.toggleControllerOrientation();
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

当 controller 中的返回键钮被点击了:

        videoView.setBackListener(new ExoVideoPlaybackControlView.ExoClickListener() {
            @Override
            public boolean onClick(View view, boolean isPortrait) {
                if(isPortrait){
                    finish();
                }
              return false;
            }
        });

如果 onClick() 返回了true,它会拦截controller中的事件.如果返回的是false 并且你设置了一个非空的OrientationListener, ExoVideoView 如果处于横屏,ExoVideoView将尝试变回竖屏并调用OrientationLister.onOrientationChange()

Others

你也可以在横屏的时候加入一个自定义布局:

       videoView.addViewToControllerWhenLandscape(view);

你添加的布局将被加入FrameLayout中.

提示

永远不要忘记去释放ExoPlayer.

 videoView.releaseSelfPlayer();

or

player.release();

ExoVideoView 也支持手势操作, 比如说左滑调亮度,右滑调音量,也可以快近或后退。

app目录下是demo。

ExoPlayerVideoView传送门,欢迎star。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jerry的SAP技术分享

SAP成都研究院C4C光明左使:SAP Cloud for Customer 使用SAP UI5的独特之处

2017年7月,SAP成都研究院C4C开发团队刚刚建立。某个周一早晨的Scrum meeting,新出现一位眉清目秀的小伙子,向大家自我介绍:“大家好,我叫杨x...

16320
来自专栏HT

快速开发基于 HTML5 网络拓扑图应用

采用 HT 开发网络拓扑图非常容易,例如《入门手册》的第一个小例子麻雀虽小五脏俱全:http://www.hightopo.com/guide/guide/co...

61080
来自专栏腾讯移动品质中心TMQ的专栏

手机管家(Android)UI过度渲染自动化测试方案

通常我们可以从各种渠道听到用户反馈app卡顿,究竟是什么用户觉得卡顿呢?

45310
来自专栏新智元

【干货】谷歌 TensorFlow 工程负责人:标记大规模图片的最简方法

【新智元导读】前谷歌 TensorFlow 工程负责人 Peter Warden 和大家分享了利用 OSX 系统里的 Find 快速为大规模图片打标签,以优化深...

38490
来自专栏人工智能

100天教程:在Unity中为敌人创造AI动作

译者:刘鸿(lewis2012) 审校:王玥亭(玥亭) 这里是虚拟现实100天的第12天。昨天,我们研究了rigs模型和Unity的mecanim系统(我应该学...

23590
来自专栏腾讯大讲堂的专栏

使用Laya引擎开发微信小游戏

使用一个简单的游戏开发示例,由浅入深,介绍了如何用Laya引擎开发微信小游戏。

2K80
来自专栏前端说吧

三级侧边栏-树形菜单案例效果

67950
来自专栏何俊林

斗鱼直播项目(已开源)

推荐一个项目,仿斗鱼直播的,功能强大,可以借鉴学习。 目录结构 开发环境 更新日志 应用截图 下载地址 接口文档说明 项目中使用到的三方库说明 项目反馈 参...

2.9K90
来自专栏程序员的知识天地

一个Mac系统,能让程序员编程效率提升30%

Mac 系统一向以提供高效的工作环境著称,iOS、Android和服务端程序员都可以轻松的在Mac上搭建舒适的开发环境。

29620
来自专栏何俊林

一个电商项目【拉手团购】购物App(已开源)

图:青岛八大关 之前很多人在后台问,是否有商城或电商项目推荐,今天推荐一款myxh开源的【拉手团购】购物App,基本上涵盖电商项目中所有功能。开源不易,大家多多...

43850

扫码关注云+社区

领取腾讯云代金券