sinavideo_playersdk

Introduction: 最容易集成的开源播放器组件,支持直播,支持软硬解切换,支持清晰度切换
Other: 特点:
(1) 使用自定义控件方式提供播放器UI,不需要视频相关知识,能编写android应用就能使用
(2) 软硬解切换、点播直播支持
(3) 解码内核小于4M,更方便集成到非专业视频app中
(4) 修正一些vitaimio的问题,比如m3u8可以拖动等等
More: Author   ReportBugs   DemoAPK   Doc
Tags:

内核开源了,参考 splayer 以及 dlna 项目!!! 因为换了新工作,没法继续视频相关的事情了,这个项目以后也会停止更新,所以,最后阶段开放了内核源码,有兴趣研究的,就继续看看吧。或者 fork 了拿去改也可以。

郑重声明

VDPlayerSDK 开源且免费,遵循 bsd 开源协议,无授权费,甚至于,你可以任意修改签名标注等,抹掉 VDPlayerSDK 的任何痕迹都是允许的

项目的由来

大部分时候,在 android 中集成一个视频播放器是很痛苦的过程,因为 google 提供的多媒体控件实在距离 UI 太远(似乎这个框架根本没法用),我们也一样深受其害,所以,我们在自己研发解码器的时候,就顺手也处理了一下 UI 部分的逻辑。我们封装了大部分的播放器中的 UI 控件,比如 playbutton 之类的,把里面的大部分事件用 EventBus 模式进行了处理。这样,最终的结果是,大部分时候,集成一个播放器只需要三步就可以了。具体的可以参照 demo 中的例子,代码量确实很少,你懂的。

忘了说了,我们支持广告播放,但只支持多流方式,也就是广告跟正片是分着的。以后会加入广告跟正片动态合并为单流播放方式,以避免,广告播放后,正片还需要加载 loading 的问题。

集成步骤

集成一个播放器需要几步?三步

  1. 设置一个播放列表

     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);
    
  2. 从 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" >
    

    `

  3. 设置一下 layout 中的素材,比如文字、颜色,图片,大小等等

然后,就可以提交上线了

组件说明:

  1. VDVideoView,统一的接口类
  2. VDVideoViewController,使用 EventBus 方式来处理的消息控制中心
  3. widgets,自定义的组件库
  4. 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,包括:新浪新闻、新浪体育、新浪视频、新浪游戏。新浪微博也正在接洽中

Apps
About Me
Google+: Trinea trinea
GitHub: Trinea