简述


视频播放是我们开发中比较常见的场景。这两年关于视频方面的热度不断提升,可以说前两年是直播年,今年是小视频年,各种短视频应用铺天盖地。对于视频的业务场景也越来越丰富,功能也越来越多。对于我们开发来说播放相关组件的代码变得也越来越复杂,管理维护成本也越来越高,面对不断迭代的业务,我们需要一种有效的方案来应对这种频繁的业务变化。


这几年一直在做视频相关的业务,手机端和TV端均做过适配开发。MediaPlayer、exoplayer、ijkplayer、VLC、FFmpeg等都摸索使用过。这一路遇到很多问题……说多了都是泪,为了适应多变的产品需求,中间重构了N多个版本。最终PlayerBase也就诞生了。PlayerBase3 版本进行了完整重构设计,目前大致框架基本已稳定下来。对于大部分应用视频播放组件场景都能轻松处理。


^_^ star传送门--->项目地址:https://github.com/jiajunhui/PlayerBase


P图技术有限,文中图片就凑合着看吧!


框架简介


请注意! 请注意! 请注意! PlayerBase区别于大部分播放器封装库。


PlayerBase是一种将解码器和播放视图组件化处理的解决方案框架。您需要什么解码器实现框架定义的抽象引入即可,对于视图,无论是播放器内的控制视图还是业务视图,均可以做到组件化处理。将播放器的开发变得清晰简单,更利于产品的迭代。

PlayerBase不会为您做任何多余的功能业务组件,有别于大部分播放器封装库的通过配置或者继承然后重写然后定制你需要的功能组件和屏蔽你不需要的功能组件(这种之前我也经历过,上层可能需要经常改动,感觉很low!!!)。正确的方向应该是需要什么组件就拓展添加什么组件,不需要时移除即可,而不是已经提供了该组件去选择用不用。


 功能特色

视图的组件化处理
视图组件的高复用、低耦合
解码方案的组件化、配置化管理
视图组件的完全定制
视图组件的热插拔,用时添加不用时移除
自定义接入各种解码方案
解码方案的切换
支持倍速播放
支持Window模式播放
支持Window模式的无缝续播
支持列表模式的无缝续播
支持跨页面无缝续播
支持调整画面显示比例
支持动态调整渲染视图类型
支持VideoView切角处理,边缘阴影效果
提供自定义数据提供者
统一的事件下发机制
扩展事件的添加
等功能……
部分使用示例

解码配置和框架初始化

public class App extends Application { 
 
    @Override 
 
    public void onCreate() { 
 
        //... 
 
        //如果您想使用默认的网络状态事件生产者,请添加此行配置。 
 
        //并需要添加权限 android.permission.ACCESS_NETWORK_STATE 
 
        PlayerConfig.setUseDefaultNetworkEventProducer(true); 
 
        //设置默认解码器 
 
        int defaultPlanId = 1; 
 
        PlayerConfig.addDecoderPlan(new DecoderPlan(defaultPlanId, IjkPlayer.class.getName(), "IjkPlayer")); 
 
PlayerConfig.setDefaultPlanId(defaultPlanId); 
 
        //初始化库 
 
        PlayerLibrary.init(this); 
 
    } 
 
}


组装组件(添加您需要的组件【组件来自用户自定义,框架不提供任何视图组件】)

ReceiverGroup receiverGroup = new ReceiverGroup();
//Loading组件
receiverGroup.addReceiver(KEY_LOADING_COVER, new LoadingCover(context));
//Controller组件
receiverGroup.addReceiver(KEY_CONTROLLER_COVER, new ControllerCover(context));
//CompleteCover组件
receiverGroup.addReceiver(KEY_COMPLETE_COVER, new CompleteCover(context));
//Error组件
receiverGroup.addReceiver(KEY_ERROR_COVER, new ErrorCover(context));
设置组件启动播放
BaseVideoView videoView = findViewById(R.id.videoView);
videoView.setReceiverGroup(receiverGroup);
DataSource data = new DataSource("http://url...");
videoView.setDataSource(data);
videoView.start();
事件的监听
//player event
videoView.setOnPlayerEventListener(new OnPlayerEventListener(){
    @Override
    public void onPlayerEvent(int eventCode, Bundle bundle){
        //...
    }
});


//receiver event
videoView.setOnReceiverEventListener(new OnReceiverEventListener(){
    @Override
    public void onReceiverEvent(int eventCode, Bundle bundle) {
        //...
    }
});


详细使用示例请参阅github项目主页介绍