简单的前提是使用开源库
在库的基础上添加相对应的功能,
以 JiaoZiVideoPlayer 为例 , 本身自带的播放引擎是 MediaPlayer, 也就是 Android 自带的播放器, 有很多不完善的地方, 倍速切换只支持 5.0 以上, 否则报 NoClassDefFoundError 错误
而且还不支持 rtmp 类型的播放流
所以在播放引擎上建议不要使用默认的, 目前比较流行的是 ijkplayer
但是只使用 ijkplayer, 还需要自己写逻辑, 布局等等
为了简便, 直接给 JiaoZiVideoPlayer 使用 ijk 播放引擎, 省去了写布局和播放逻辑的麻烦
准备工作
1. JiaoZi 播放器
implementation 'cn.jzvd:jiaozivideoplayer:6.2.7'
2. ijk(建议引入, 需要添加 so 库)
- implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4'
- implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
3. m3u8 视频下载 (如不需要可以不加)
implementation 'com.jwkj:M3U8Manger:v2.1.9'
Android Studio 3.0 以上建议使用 implementation 方式引入第三方库, 以下使用 compile
自定义播放器布局
JiaoZi 的播放器控件是 JZVideoPlayerStandard 所有关于播放器布局控件的操作都需要通过该控件, 能满足一般的视频播放需求但是如果需要在 JiaoZi 播放器中添加按钮, 就需要自定义 JZVideoPlayerStandard 比如倍速播放下载清晰度切换等功能
如果不需要修改布局, 直接在 xml 布局文件中使用即可
1. 重写 XML
如果需要给播放器添加新的控件, 或者更换图片, 修改按钮位置等必须要把原来的 XML 完整拷贝至新建 XML 中, 控件名称建议不能修改, 只添加你需要的控件就行了
原有的控件不能删除, 否则会报错
通过 getLayoutId() 方法设置自定义布局文件
- @Override
- public int getLayoutId() {
- return R.layout.jiaozi_player_video;
- }
2. 添加倍速切换下载控件
2.1 在 init 方法中初始化控件
- video_speed = (TextView) findViewById(R.id.video_speed);
- video_speed.setOnClickListener(this);
2.2 监听
注意: JZVideoPlayerStandard 只是提供了布局的相关操作倍速切换涉及到引擎的加速, 所以暂时用广播的方式去通知 Activity 调用引擎 (放在后面讲)
- @Override
- public void onClick(View v) {
- super.onClick(v);
- int i = v.getId();
- if (i == R.id.video_speed) {
- // 切换倍速
- video_speed.setText(resolveTypeUI(mFloat) + "X");
- mFloat = resolveTypeUI(mFloat);
- EventBus.getDefault().post(new SpeedEvent(mFloat));
- // 更新播放状态
- onStatePreparingChangingUrl(0, getCurrentPositionWhenPlaying());
- }else if (i == R.id.video_download) {
- // 下载
- }
- }
- /* 显示倍速比例 */
- public static float resolveTypeUI(float speed) {
- if (speed == 1) {
- speed = 1.25f;
- } else if (speed == 1.25f) {
- speed = 1.5f;
- } else if (speed == 1.5f) {
- speed = 2f;
- } else if (speed == 2f) {
- speed = 1f;
- }
- return speed;
- }
2.3 针对播放状态控制控件显隐
实际需求中, 如果是在全屏状态才需要展示控件, 那么就需要这一步操作
JiaoZiVideoPlayer 默认有清晰度切换的控件, 不需要重复写相关逻辑
- @Override
- public void setUp(Object[] dataSourceObjects, int defaultUrlMapIndex, int screen, Object... objects) {
- super.setUp(dataSourceObjects, defaultUrlMapIndex, screen, objects);
- // 如果是全屏才显示相关按钮
- Log.e("data========:", dataSourceObjects.length+"");
- if (currentScreen == SCREEN_WINDOW_FULLSCREEN) {
- video_speed.setVisibility(VISIBLE);
- video_download.setVisibility(VISIBLE);
- } else if (currentScreen == SCREEN_WINDOW_NORMAL) {
- video_speed.setVisibility(GONE);
- video_download.setVisibility(GONE);
- } else if (currentScreen == SCREEN_WINDOW_TINY) {
- video_speed.setVisibility(GONE);
- video_download.setVisibility(GONE);
- }
- }
自定义播放引擎
如果要实现倍速播放, 不管是 自带的 MediaPlayer 还是 ijkPlayer 都必须要自定义播放引擎只不过各自继承的引擎不同
1. 提供倍速切换的方法
- // 播放速度, 默认 1
- public float speeding=1f;
- public float getSpeeding() {
- return speeding;
- }
- public void setSpeeding(float speeding) {
- this.speeding = speeding;
- }
2. 通过引擎切换倍速
- ijkPlayer:
- @Override
- public void onPrepared(IMediaPlayer iMediaPlayer) {
- Log.e("speed=======:", getSpeeding() + "");
- ijkMediaPlayer.setSpeed(getSpeeding());
- ijkMediaPlayer.start();
- }
- MediaPlayer:
- @Override
- public void onPrepared(MediaPlayer mediaPlayer) {
- // 设置倍速, 5.0 以下不支持, 会抛异常
- try {
- mediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(getSpeeding()));
- }catch (NoClassDefFoundError e){
- }
- mediaPlayer.start();
- }
使用
1. 设置播放控件
- <com.wapchief.qiniuplayer.views.MyJZVideoPlayerStandard
- android:layout_width="match_parent"
- android:layout_height="200dp"
- android:id="@+id/jiaozi_player"/>
2. 初始化播放地址
如果不需要清晰度切换直接把 objects 替换成视频 URL 链接就行了
- /**
- * 初始化播放地址
- */
- private String[] mediaName = {"普通","高清","原画"};
- private void initPlayerUrl() {
- Object[] objects = new Object[3];
- LinkedHashMap map = new LinkedHashMap();
- for (int i = 0; i < 3; i++) {
- map.put(mediaName[i], MediaUrl.URL_M3U8);
- }
- objects[0] = map;
- objects[1] = false;
- objects[2] = new HashMap<>();
- ((HashMap) objects[2]).put("key", "value");
- mPlayerStandard.setUp(objects, 0, JZVideoPlayer.SCREEN_WINDOW_NORMAL, "");
- }
3. 初始化播放引擎
- // 自定义 MediaPlayer
- MyJZMediaSystem mJZMediaSystem = new MyJZMediaSystem();
- // 自定义 ijk
- MyIJKMediaSystem mIJKMediaSystem = new MyIJKMediaSystem();
- @Override
- protected void onPause() {
- super.onPause();
- JZVideoPlayer.releaseAllVideos();
- JZVideoPlayer.setMediaInterface(mIJKMediaSystem);
- }
- @Override
- public void onBackPressed() {
- if (JZVideoPlayer.backPress()) {
- return;
- }
- super.onBackPressed();
- }
4. 倍速切换事件
- /** 倍速切换 */
- @Subscribe(threadMode = ThreadMode.POSTING)
- public void onMessageEventPostSpeed(SpeedEvent event) {
- mJZMediaSystem.setSpeeding(event.getSpeed());
- mIJKMediaSystem.setSpeeding(event.getSpeed());
- Toast.makeText(this, "正在切换倍速:"+event.getSpeed(), Toast.LENGTH_LONG).show();
- }
来源: http://www.jianshu.com/p/f9ae63d04fc2