PlayerBase

Project Url: jiajunhui/PlayerBase
Introduction: PlayerBase 将播放器的繁杂功能其业务组件化处理的框架方案
More: Author   ReportBugs   
Tags:

PlayerBase 是一种将播放业务组件化处理的解决方案框架。无论是播放器内的控制视图还是业务视图,均可以做到组件化处理。将播放器的开发变得清晰简单,更利于产品的迭代。框架内包含系统 MediaPlayer 的解码实现,demo 里面有一套完整的 IJKPlayer 解码方案的实现和接入,请参见源码可以接入其他播放器解码方案。框架默认自带一套控制组件,包含播放控制组件、Loading 组件、Error 组件、手势处理组件等,所有 UI 功能组件可完全自定义。

遇到问题,请联系作者。QQ:309812983 Email:junhui_jia@163.com

效果
image image image

Demo 下载

Demo 下载

功能

-解码方案的组件化、配置化管理
-自定义接入各种解码方案
-多种解码方案的切换
-提供自定义数据提供者
-视图的组件化处理
-可根据需求自定义视图组件层
-统一的事件下发机制
-扩展事件的添加
-默认支持历史点定点播放
-支持列表播放中的无缝续播
-支持边播边缓存功能-
-支持视频切角处理,边缘阴影效果-
-等功能……

image image

框架的设计

image image image image image


详细的设计思路见附件 PPT

PPT

使用

需要的权限,如果 targetSDK 版本在 Android M 以上的,请注意运行时权限的处理。

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

添加如下依赖

dependencies {
  compile 'com.kk.taurus.playerbase:PlayerBase:2.1.9'
}

如果要使用边播边缓存功能,你还需要添加以下依赖:

dependencies {
  compile 'com.danikula:videocache:2.7.0'
}

并在 application 初始化时下添加您的配置代码:

VideoCacheProxy.get().initHttpProxyCacheServer(
                new VideoCacheProxy.Builder(this)
                        .setCacheDirectory(Environment.getExternalStorageDirectory())
                        .setFileNameGenerator(new TestCacheFileNameGenerator()));
VideoCacheProxy.get().setVideoCacheState(true);

代码混淆时,请在 proguard 中添加如下保护

-keep public class * extends android.view.View{*;}

-keep public class * implements com.kk.taurus.playerbase.inter.IDecoder{*;}

-keep public class * implements com.kk.taurus.playerbase.inter.IRenderWidget{*;}

# 如果添加了缓存依赖,请将如下保护也加入到 proguard 中
-keep class com.danikula.videocache.HttpProxyCacheServer{*;}

-keep class com.danikula.videocache.file.FileNameGenerator{*;}

-keep class com.danikula.videocache.HttpProxyCacheServer$Builder{*;}

使用 DefaultPlayer 对象,可写入 xml 布局中,也可用代码创建。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.kk.taurus.playerbase.DefaultPlayer
        android:id="@+id/player"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>
DefaultPlayer mPlayer = (DefaultPlayer) findViewById(R.id.player);
DefaultReceiverCollections receiverCollections = new DefaultReceiverCollections(this);
        receiverCollections.buildDefault();
mPlayer.bindReceiverCollections(receiverCollections);
VideoData videoData = new VideoData("http://url...");
mPlayer.setDataSource(videoData);
mPlayer.start();

说明

系统的播放模式有两种。
一种是 Decoder+RenderView 方案,对应 API 设置中的IPlayer.WIDGET_MODE_DECODER
另一种是 VideoView 方案。对应 API 设置中的IPlayer.WIDGET_MODE_VIDEO_VIEW
框架默认自带系统的 MediaPlayer 方案和 VideoView 方案。如果不做任何配置即为默认的 MediaPlayer 方案。当需要使用无缝切播功能时,必须设置为IPlayer.WIDGET_MODE_DECODER模式。

接入其他播放器

一下示例为接入 IJKPlayer
Decoder 方案,接入 IjkMediaPlayer

public class IJkDecoderPlayer extends BaseDecoder {

    private IjkMediaPlayer mMediaPlayer;

    public IJkDecoderPlayer(Context context) {
        super(context);
        init(context);
    }

    private void init(Context context) {
        mMediaPlayer = new IjkMediaPlayer();
        // init player
        IjkMediaPlayer.loadLibrariesOnce(null);
        IjkMediaPlayer.native_profileBegin("libijkplayer.so");
    }

    @Override
    public void setDataSource(VideoData data) {
        //......
    }

    @Override
    public void start() {
        //......
    }

    @Override
    public void pause() {
        //......
    }

    @Override
    public void resume() {
        //......
    }

    @Override
    public void seekTo(int msc) {
        //......
    }

    //......
}

具体参见项目代码。
使用前做如下配置:

DecoderType.getInstance().addDecoderType(1,new DecoderTypeEntity("ijkplayer","com.kk.taurus.ijkplayer.IJkDecoderPlayer"));
DecoderType.getInstance().setDefaultDecoderType(1);
ConfigLoader.setDefaultWidgetMode(this, IPlayer.WIDGET_MODE_DECODER);

VideoView 方案,接入 IjkVideoView
详见项目代码 IJKVideoViewPlayer

组件视图

框架自带一套默认组件,包含 Loading 组件、Error 组件、Controller 组件、手势处理组件等。
这些组件均继承自父类 BaseCover(覆盖层基类)

自定义覆盖层组件

public class CustomCover extends BaseCover{

    public CustomCover(Context context) {
        super(context);
    }

    public CustomCover(Context context, BaseCoverObserver coverObserver) {
        super(context, coverObserver);
    }

    //......

}

自定义组件的使用。

mPlayer = (DefaultPlayer) findViewById(R.id.player);
DefaultReceiverCollections receiverCollections = new DefaultReceiverCollections(this);
receiverCollections
    .addCover("custom_cover",new CustomCover(context)).build();
mPlayer.bindReceiverCollections(receiverCollections);

无缝续播的使用

类似于今日头条等应用的效果,在列表中播放时无缝续播进入详情页或者无缝进入全屏页面。

原理:使用 Decoder+RenderView 方案,解码器动态关联不同的渲染视图(RenderView),比如使用 MediaPlayer 动态关联 SurfaceView,就如同一个电脑主机不断连接不同的显示器。
主要方法:

public void setRenderViewForDecoder(IRender render)

详见项目代码 ListVideoAdapter 和 SecondActivity。

交流

联系方式:junhui_jia@163.com QQ 群:600201778

Android 开发经验分享
随手点击下面广告支持本站吧
 
Android 开发经验分享