内核开源了,参考splayer以及dlna项目!!! 因为换了新工作,没法继续视频相关的事情了,这个项目以后也会停止更新,所以,最后阶段开放了内核源码,有兴趣研究的,就继续看看吧。或者fork了拿去改也可以。
##郑重声明
VDPlayerSDK开源且免费,遵循bsd开源协议,无授权费,甚至于,你可以任意修改签名标注等,抹掉VDPlayerSDK的任何痕迹都是允许的
##项目的由来
大部分时候,在android中集成一个视频播放器是很痛苦的过程,因为google提供的多媒体控件实在距离UI太远(似乎这个框架根本没法用),我们也一样深受其害,所以,我们在自己研发解码器的时候,就顺手也处理了一下UI部分的逻辑。我们封装了大部分的播放器中的UI控件,比如playbutton之类的,把里面的大部分事件用EventBus模式进行了处理。这样,最终的结果是,大部分时候,集成一个播放器只需要三步就可以了。具体的可以参照demo中的例子,代码量确实很少,你懂的。
忘了说了,我们支持广告播放,但只支持多流方式,也就是广告跟正片是分着的。以后会加入广告跟正片动态合并为单流播放方式,以避免,广告播放后,正片还需要加载loading的问题。
##集成步骤
集成一个播放器需要几步?三步
-
设置一个播放列表
info = new VDVideoInfo(); info.mTitle = "这就是一个测试视频0"; info.mPlayUrl = "http://wtv.v.iask.com/player/ovs1_vod_rid_2015052841_br_3_pn_weitv_tn_0_sig_md5.m3u8"; infoList.addVideoInfo(info); // 初始化播放器以及播放列表 mVDVideoView.open(SinaVideoActivity.this, infoList); // 开始播放,直接选择序号即可 mVDVideoView.play(0);
-
从demo里面copy一份layout出来
<com.sina.sinavideo.sdk.VDVideoView android:id="@+id/vv1" android:layout_width="match_parent" android:layout_height="240dp" android:layout_alignParentTop="true" android:background="#000000" app:layerAttrs="@array/sv_videoview_layers2" > </com.sina.sinavideo.sdk.VDVideoView>
-
设置一下layout中的素材,比如文字、颜色,图片,大小等等
然后,就可以提交上线了 ##组件说明:
- VDVideoView,统一的接口类
- VDVideoViewController,使用EventBus方式来处理的消息控制中心
- widgets,自定义的组件库
- Containers,自定义的容器类,包裹widgets用得
###VDVideoView VDVideoView是提供给客户端用的,客户端只需使用VDVideoView就能完成视频的播放的功能;VDVideoView封装了视频播放的View和 控制层UI,提供了横竖屏切换和播放视频的接口。 其中 layerAttrs属性用于设置小屏和全屏的播放器控制层UI。
####控制部分
open(Context context, VDVideoListInfo infoList) 该方法用于设置视频列表。
open(Context context, VDVideoInfo path) 简化版,设置单视频
play(int index), 该方法用于播放视频列表里的第index个视频
play(int index, long position), 播放第index个视频,并且从position开始,position为毫秒
setIsFullScreen(boolean isFullScreen) 该方法用来设置全屏或小屏
stop() 该方法停止播放视频
release(boolean isOnlyReloadVideo) 该方法销毁播放器
####activity回调部分
基本与activity使用同名函数,默认onResume使用暂停方式提供,即:onPause->onStop->onResume调用链后,当前视频是在暂停状态的
####其他部分,包括广告等
getIsPlaying() 是否播放中
getPlayerStatus() 播放器当前状态[getIsPlaying的复杂版,能得到更多状态]
VDVideoListInfo getListInfo() 拿到当前的播放列表
setLayers(int resourceID) 手动加载layer,用于在一些无法写layout xml的场合,比如列表播放的时候
setExternalFullContainer(ViewGroup vg)
设置父容器,用来做全屏转换
有时候,播放器会嵌入到很奇怪的vg中,比如:fragment等
默认,SDK会自己寻找decoreView为父类容器
但在特殊情况下,找到的decoreView不是正确的父容器,这时候需要手工指定
refreshInsertADList(List insertADList, VDVideoInfo currInfo)
播放中,加入新的广告贴片,一般用在点击播放列表的时候。
###VDVideoInfoList
播放列表,用来设置需要播放的流
###VDVideoViewController
封装了播放器控制行为操作,例如 手势,按钮点击事件。一般情况下,请不要直接调用
###widgets
详细的参考:【还没写完】
###containers
详细的参考:【还没写完】
###VDVideoExtListeners
外部事件封装,app端的activity有时候需要得到播放器的一些事件回调。这个时候就需要用到外部listener类
通过VDVideoView中的set***Listener函数族来注册事件,并且在activity中的implement来进行回调。
具体用法参见demo中的例子。
##一些提示 ###我如何安排集成播放器的开发节奏? 我们推荐的开发进程安排如下:
1、 从Demo工程与《快速启动》文档开始,时间控制在0.5Day
2、 在自己的工程中,copy进demo中的layout设计,让它先在自己的项目中跑起来,时间:0.5Day
3、 按照产品经理的产品需求,参照设计师设计的UI,进行layout的编写工作(理论上就是切图,换图,然后运行起来看看),在期间,可以参照《用户手册》文档,熟悉系统提供的widget与container的用法,时间2.5Day
4、 开始自测以及机型适配工作,时间:3Day
5、 提交测试吧。
###什么是简单模式与复杂模式?
根据产品的不同呈现,播放器SDK分为:简单模式跟复杂模式。
简单模式:只有一层layer,一般为竖屏,可以自定义组件,但相应扩展能力较弱
复杂模式:可以包含N层layer,一般一层layer竖屏,一层layer横屏,其余各层作为显示层或者广告层,扩展强,容易定制,layer文件的长度也容易控制。
###什么是layer?
我们自定义了一个layer概念,用于分别堆放不同用途的container与widget。在复杂模式下,一般一个layer表示一个确定的功能,比如:控件层、显示层。系统默认,最下面一层是Videiview层,用来播放视频。 ###什么是widget与container?
Wideget是控件的意思,比如:开始按钮,就是一个控件,集成自view。
container是容器的意思,因为播放器中,有很多自定义的消息需要处理,而系统提供的容器无法使用,可以理解为:viewgroup
###可靠性
现在新浪的一部分app正在或者即将使用此款SDK,包括:新浪新闻、新浪体育、新浪视频、新浪游戏。新浪微博也正在接洽中