Skip to content
Doikki edited this page Jul 1, 2022 · 44 revisions

特性

功能 MediaPlayer IjkPlayer ExoPlayer
调整显示比例 支持 支持 支持
滑动调节播放进度、声音、亮度 支持 支持 支持
双击播放、暂停 支持 支持 支持
重力感应自动进入/退出全屏以及手动进入/退出全屏 支持 支持 支持
倍速播放 不支持 支持 支持
视频截图(使用SurfaceView时都不支持,默认用的是TextureView) 支持 支持 支持
列表小窗全局悬浮播放 支持 支持 支持
连续播放一个列表的视频 支持 支持 支持
广告播放 支持 支持 支持
边播边缓存,使用了 AndroidVideoCache 实现 支持 支持 支持
弹幕,使用 DanmakuFlameMaster 实现 支持 支持 支持
多路播放器同时播放 支持 支持 支持
没有任何控制UI的纯播放 支持 支持 支持
Android 8.0画中画 支持 支持 支持
无缝衔接播放 支持 支持 支持
抖音,实现预加载 支持 支持 支持

简单使用

建议使用之前先把demo跑一下,我对很多使用姿势都进行了演示。

1.添加类库

gradle

repositories {
    mavenCentral()
}

dependencies {
    # 必选,内部默认使用系统mediaplayer进行解码
    implementation 'xyz.doikki.android.dkplayer:dkplayer-java:3.3.6'

    # 可选,包含StandardVideoController的实现
    implementation 'xyz.doikki.android.dkplayer:dkplayer-ui:3.3.6'

    # 可选,使用exoplayer进行解码
    implementation 'xyz.doikki.android.dkplayer:player-exo:3.3.6'

    # 可选,使用ijkplayer进行解码
    implementation 'xyz.doikki.android.dkplayer:player-ijk:3.3.6'
    
    # 可选,如需要缓存或者抖音预加载功能请引入此库
    implementation 'xyz.doikki.android.dkplayer:videocache:3.3.6'
}

或者将library下载并导入项目中使用

注意:

  • 3.0.4及以后的版本同时支持了androidx和support library。
  • 3.1.2及以后的版本适配了刘海屏。
  • 3.1.3及之后的版本已经将ijkplayer的so库合并到了player-ijk这个库里面了,开发者可通过abiFilters来筛选你需要的so,例如:
ndk {
    abiFilters "arm64-v8a"
}

2.添加布局

<xyz.doikki.videoplayer.player.VideoView
        android:id="@+id/player"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

注意:一定要定死宽高

3.设置视频地址、控制器等

videoView.setUrl(URL_VOD); //设置视频地址
StandardVideoController controller = new StandardVideoController(this); 
controller.addDefaultControlComponent("标题", false);
videoView.setVideoController(controller); //设置控制器
videoView.start(); //开始播放,不调用则不自动播放

4.在Activity

@Override
    protected void onPause() {
        super.onPause();
        videoView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        videoView.resume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        videoView.release();
    }
    

    @Override
    public void onBackPressed() {
        if (!videoView.onBackPressed()) {
            super.onBackPressed();
        }
    }

5.在AndroidManifest.xml

<activity
    android:name=".PlayerActivity"
    android:configChanges="orientation|screenSize|keyboardHidden"
    android:screenOrientation="portrait" /> <!-- or android:screenOrientation="landscape"-->

切换播放核心

首先需要引入相关依赖,需要注意,播放器内部默认使用系统MediaPlayer进行解码

全局切换

建议在Application中调用

 VideoViewManager.setConfig(VideoViewConfig.newBuilder()
         //使用使用IjkPlayer解码
         .setPlayerFactory(IjkPlayerFactory.create())
         //使用ExoPlayer解码
         .setPlayerFactory(ExoMediaPlayerFactory.create())
         //使用MediaPlayer解码
         .setPlayerFactory(AndroidMediaPlayerFactory.create())
         .build());

临时切换

调用VideoView中的setPlayerFactory方法,需要在start方法之前调用方可生效

//使用IjkPlayer解码
mVideoView.setPlayerFactory(IjkPlayerFactory.create());
//使用ExoPlayer解码
mVideoView.setPlayerFactory(ExoMediaPlayerFactory.create());
//使用MediaPlayer解码
mVideoView.setPlayerFactory(AndroidMediaPlayerFactory.create());

高级用法

参考demo ╰( ̄▽ ̄)╭

混淆

-keep class xyz.doikki.videoplayer.** { *; }
-dontwarn xyz.doikki.videoplayer.**

# IjkPlayer
-keep class tv.danmaku.ijk.** { *; }
-dontwarn tv.danmaku.ijk.**

# ExoPlayer
-keep class com.google.android.exoplayer2.** { *; }
-dontwarn com.google.android.exoplayer2.**
Clone this wiki locally