基于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。

目录
相关文章
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
JavaScript Windows 容器
Flutter Web:根据浏览器窗口改变布局大小
之前我们通过flutter开发web应用,然后用electron打包成可执行文件在pc端使用,因为electron可以设置最小宽高,所以布局不会越界,但是如果直接在浏览器中打开,因为浏览器的大小无法控制,如果用户缩小浏览器会导致布局越界。根据大部分网站的经验来看,当窗口缩小到一定程度后,布局就不会再改变,反而是增加了滚动,这样就保证了布局的正确性,所以我们也打算这么做。
1624 0
|
6月前
|
Java 程序员 数据处理
课时19:Java运算符(位运算符)
课时19介绍Java中的位运算符,涵盖进制转换、位与、位或及移位操作。重点讲解了二进制与其他进制的转换方法,通过具体范例演示了位与和位或运算的过程,并展示了八进制和十六进制的处理方式。此外,还解释了逻辑运算符(&&、||)与位运算符(&、|)的区别及其应用场景,特别是位运算在加密中的应用。
118 5
|
Android开发
Android使用ViewPager做无限轮播,人为滑动时停止
Android使用ViewPager做无限轮播,人为滑动时停止
179 2
|
存储 自然语言处理 前端开发
Star 6.9k!开源的全能Markdown格式文件提取器:MinerU
总的来说,MinerU是一款非常实用且强大的数据提取工具。无论你是开发者、互联网从业者,还是有具体需求的新人小白,MinerU都能极大地提升你的工作效率,让你专注于更有价值的工作。 最后,如果你对MinerU感兴趣,不妨亲自尝试一下,相信你会爱上这款全能的Markdown格式文件提取器。
|
SQL 数据库连接 Shell
python连接SqlServer数据库
要使用Python连接SQL Server数据库,你需要先安装pyodbc库,然后使用它来建立连接。
468 1
python连接SqlServer数据库
|
存储 编解码 vr&ar
色彩空间与像素格式
颜色是不同波长的光对人眼刺激产生的色彩感觉。色彩空间(Color Space)是颜色的数学表示,根据不同的表示方法分为不同的色彩模型。最常用的色彩模型有三类:RGB(用于计算机图形学), YUV(用于视频系统), CMYK(用于彩色印刷)。后文对色彩空间与色彩模型的叫法不作区分。本文仅讨论视频图像处理领域常用的 RGB 色彩空间和 YUV 色彩空间。
3154 0
色彩空间与像素格式
|
机器学习/深度学习 NoSQL API
整理了上千个Python类库,简直太酷啦!
整理了上千个Python类库,简直太酷啦!
377 0
|
Android开发
两种方法,教你解决 ViewPager 嵌套 ViewPager滑动冲突(一)
两种方法,教你解决 ViewPager 嵌套 ViewPager滑动冲突
|
缓存 Android开发 异构计算
Android 弹幕的两种实现及性能对比 | 自定义 LayoutManager
Android 弹幕的两种实现及性能对比 | 自定义 LayoutManager
640 0
Android 弹幕的两种实现及性能对比 | 自定义 LayoutManager