基于ExoPlayer的ExoPlayerVideoView

简介: 写在前面在Android设备中,播放视频和音乐是非常普遍的。Android框架提供了一个对于媒体的操作的最省代码的解决方案:MediaPlayer。它提供了低等级的媒体API,例如:MediaCodec,AudioTrack,MediaDrm,可以用于建立自定义媒体播放的解决方案。

写在前面

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

概览

img_9997c77451ac9d24ecaf33ad56038ce7.png
亮度调节
img_5f57f1ed32416daf016969106b8973a7.png
控制器
img_011255b144d8d3f04628a20018a5e9b1.png
快进快退
img_a48ea88b177fc5ae0f76e2e8d435b9bc.png
横屏
img_8000b308285d07f505bddd2e99f474d4.png
竖屏
img_a9e57f6c61a7568e247398ccfa81dcf4.png
音量

开始

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。

目录
相关文章
|
机器人
阿里云 RPA 的成本效益分析
机器人流程自动化(RPA)技术在企业数字化转型中扮演着越来越重要的角色。阿里云 RPA 作为一种高效的自动化解决方案,不仅可以提高业务效率,还可以降低运营成本。本文将对阿里云 RPA 的成本效益进行分析,帮助企业更好地评估和利用这一技术。
|
前端开发 Java 关系型数据库
超市商品管理系统的设计与实现(论文+源码)_kaic
超市商品管理系统的设计与实现(论文+源码)_kaic
|
7月前
|
数据采集 人工智能 物联网
教AI学会说'我是小喵'竟然这么神奇?LlamaFactory微调揭秘
想让AI助手记住自己叫什么名字?就像教小孩背诵身份证信息一样简单!通过LlamaFactory的SFT微调,你的AI不仅能记住自己是谁,还能在千万个问题中准确回答身份信息。从技术小白到微调高手,一篇文章搞定! #人工智能 #LlamaFactory #模型微调 #AI助手
640 2
|
传感器
基于Arduino的自动浇灌系统
基于Arduino的自动浇灌系统
1521 1
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
存储 弹性计算 人工智能
阿里云服务器2核8G/4核16G/8核32G配置热门实例规格对比与选购指南
如果我们是计划购买2核8G/4核16G/8核32G配置的阿里云服务器,在阿里云活动中一般会有经济型e、通用算力型u1、通用型g7、通用型g8i和通用型g8y几种常见的实例规格可选,尽管这些实例在配置上相似,但它们在性能、价格以及适用场景上存在显著差异。本文将深入解析这些实例规格的性能特点、价格差异及适用场景,为用户在阿里云服务器购买时提供详实的参考依据。
|
缓存 开发工具 git
Docker 从构建开始导出一个镜像
docker build [OPTIONS] PATH | URL | -
780 1
|
人工智能 弹性计算 开发工具
新发布!阿里云发布最新AI模型、工具及基础设施,建构高效全球AI社群
新发布!阿里云发布最新AI模型、工具及基础设施,建构高效全球AI社群
|
存储 安全 Java
Python File处理详解!
本文详细介绍了Python文件处理的方法及其优缺点。通过`open()`、`read()`、`write()`和`append()`等函数,Python能够轻松实现文件的创建、读取、写入及追加等操作。文章还展示了如何使用`tell()`获取文件指针位置,并提供了涵盖文件创建、读取、追加、重命名及删除的完整示例。Python文件处理不仅功能强大且跨平台兼容,但也存在易错性、安全风险及处理大文件时的性能问题。适合数据存储、配置管理和数据分析等多种应用场景。
520 4
|
自然语言处理 数据处理
浅析命名实体识别(NER)的三种序列标注方法
简述序列标注 序列标注(Sequence Tagging)是NLP中最基础的任务,应用十分广泛,如分词、词性标注(POS tagging)、命名实体识别(Named Entity Recognition,NER)、关键词抽取、语义角色标注(Semantic Role Labeling)、槽位抽取(Slot Filling)等实质上都属于序列标注的范畴。