Skip to content

Commit 0c27584

Browse files
committed
Added Intro Docs
1 parent ef6a03c commit 0c27584

File tree

6 files changed

+300
-28
lines changed

6 files changed

+300
-28
lines changed

demo/intro/index.htm

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5+
<meta http-equiv="X-UA-Compatible" value="IE=9">
6+
<title>This is a Sample of the Library</title>
7+
<!-- 在这里载入CCL的基础库 -->
8+
<link rel="stylesheet" href="../../build/style.css" />
9+
<script type="text/javascript" src="../../build/CommentCoreLibrary.js"></script>
10+
<!-- 你还可以载入其他的库,比如jQuery之类的 -->
11+
<link rel="stylesheet" href="my-page-styles.css" />
12+
</head>
13+
<body>
14+
<!-- CommentCoreLibrary 的基础 DOM 结构。这个结构也可以动态生成,只要 class 设置正确即可 -->
15+
<div id="my-player" class="abp" style="width:100%; height:300px; background:#000;">
16+
<div id="my-comment-stage" class="container"></div>
17+
</div>
18+
19+
<!-- 当然可以放很多别的东西 -->
20+
<div class="controlbox">
21+
<h3>调试用绑定</h3>
22+
<p>这里提供了一些调试用的绑定,可以通过操作它们感受操控 CCL 的方法。打开 main.js 就可以看到实现这些方法的绑定函数。</p>
23+
<ul>
24+
<li><a href="#" id="btnLoadTimeline">载入一个弹幕列表</a></li>
25+
<li><a href="#" id="btnInsertTimeline">插入一个弹幕到弹幕列表</a></li>
26+
<li><a href="#" id="btnTimer">启用/重置 定时器来告知播放器目前的播放位置</a> <span id="txPlayPos">0</span></li>
27+
</ul>
28+
</div>
29+
30+
<!-- 下面接入 CCL 代码 -->
31+
<script type="text/javascript" src="main.js"></script>
32+
</body>
33+
</html>

demo/intro/main.js

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
function $(element){
2+
// 获取 DOM 对象的短写,如果你在用 jQuery 也可以采用类似的方法
3+
return document.getElementById(element);
4+
};
5+
6+
window.addEventListener('load', function(){
7+
// 在窗体载入完毕后再绑定
8+
var CM = new CommentManager($('my-comment-stage'));
9+
CM.init();
10+
11+
// 先启用弹幕播放(之后可以停止)
12+
CM.start();
13+
14+
// 绑定按钮们
15+
$('btnLoadTimeline').addEventListener('click', function(e){
16+
e.preventDefault(); // 抑制默认操作
17+
var danmakuTimeline = [
18+
{
19+
"mode":1,
20+
"text":"Hello World",
21+
"stime":0,
22+
"size":25,
23+
"color":0xffffff
24+
}
25+
];
26+
CM.load(danmakuTimeline);
27+
});
28+
29+
$('btnInsertTimeline').addEventListener('click', function(e){
30+
e.preventDefault(); // 抑制默认操作
31+
var danmaku = {
32+
"mode":1,
33+
"text":"Hello CommentCoreLibrary",
34+
"stime":1000,
35+
"size":30,
36+
"color":0xff0000
37+
};
38+
CM.insert(danmaku);
39+
});
40+
41+
var startTime = 0, iVal = -1;
42+
$('btnTimer').addEventListener('click', function(e){
43+
e.preventDefault(); // 抑制默认操作
44+
startTime = Date.now(); // 设定起始时间
45+
if(iVal >= 0){
46+
clearInterval(iVal); // 如果之前就有定时器,把它停掉
47+
}
48+
//建立新的定时器
49+
iVal = setInterval(function(){
50+
var playTime = Date.now() - startTime; // 用起始时间和现在时间的差模拟播放
51+
CM.time(playTime); // 通报播放时间
52+
$('txPlayPos').textContent = playTime; // 显示播放时间
53+
}, 100); // 模拟播放器每 100ms 通报播放时间
54+
});
55+
56+
// 开放 CM 对象到全局这样就可以在 console 终端里操控
57+
window.CM = CM;
58+
});

demo/intro/my-page-styles.css

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
body {
2+
margin:0px;
3+
padding:0px;
4+
font-family: "Segoe UI", "Microsoft Yahei", sans-serif;
5+
}
6+
7+
.controlbox {
8+
padding:30px;
9+
}

docs/DoingItRight.md

+88
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,91 @@ container.style.transform = "scale(" + scale + ")";
5959
```
6060

6161
进而通过让用户设置 `options.global.className = 'cmt bold'` 即可开启/关闭粗体等等。
62+
63+
### 实时弹幕支持 Live Comments
64+
实时弹幕也需要后端服务器的支持,而且比发送弹幕要复杂一些。实时弹幕可以采取Polling(定时读取)或者
65+
Push Notify(监听等待)两个主动和被动模式实现。实时弹幕还有绝对实时和相对性时间轴更新两个时间模式。
66+
67+
- Polling
68+
69+
Polling是指设计的弹幕播放器定时访问服务器,询问服务器在某个弹幕池内某段时间后新产生的弹幕,然后把它
70+
添加到播放列表或者呈现出来的一种简单的模式。优点是:仅仅基于HTTP,可以在各种服务器(VPS、云、
71+
共享主机)和语言(PHP,Python,Ruby,Nodejs)上实现。缺点是:需要反复联网,效率底下,对服务
72+
器压力大。
73+
74+
推荐用于实时性不强的系统。
75+
76+
- Push Notify
77+
78+
Push Notify是指在客户端连接到服务器的一个端口,在有新的弹幕时,服务器主动发送弹幕信息,而客户
79+
端在收到信息后被动的呈现或者更新列表。优点:速度快,效率高,处理开销低。缺点:需要用Websockets
80+
或者Flash作为桥,要么兼容性略差一点(虽然几乎现代浏览器都支持Websockets 了),要么性能不好。
81+
82+
推荐用于非常实时的系统,如不可回看的直播间等。
83+
84+
时间轴模式也不一样
85+
86+
- 绝对实时
87+
每当收到实时弹幕就直接显示,不保存或者少量保存历史弹幕,不能自由的回看。占用内存小。
88+
89+
- 实时时间轴
90+
定期更新时间轴,把弹幕按顺序正确插入,保持弹幕时间轴新鲜度,可以自由更改播放时间。
91+
92+
下面是两个模式的一些参考伪代码:
93+
94+
// Polling example code
95+
96+
var hasLastCheckReturned = true; // 标记之前检测是否已经完成,避免服务器过载
97+
var lastCheckedTime = 0; // 上次检测时间
98+
setTimeout(function(){
99+
if(!hasLastCheckReturned){
100+
return; // 上次还没返回结果。放弃这次请求。
101+
}
102+
var xhr = new XMLHttpRequest();
103+
xhr.onreadystatechange = function(){
104+
if(xhr.readyState === 4){
105+
if(xhr.responseCode === 200){
106+
// 解析弹幕
107+
var danmakuList = yourFormatParser(xhr.responseText);
108+
for(var i = 0; i < danmakuList.length; i++){
109+
CM.insert(danmakuList[i]); // 把增量弹幕每一个都插入
110+
};
111+
lastCheckedTime = Date.now(); // 更新上次检测的时间
112+
hasLastCheckReturned = true;
113+
} else {
114+
// 可能出了问题
115+
hasLastCheckReturned = true;
116+
}
117+
}
118+
};
119+
xhr.open('GET', 'http://yoururl/somevideoid/?from=' + lastCheckedTime, true); // 告诉服务器上次检查的时间,来获取增量
120+
xhr.send(); // 发送请求
121+
hasLastCheckReturned = false;
122+
}, 3000); // 每3s检查新的弹幕
123+
124+
以及:
125+
126+
// Push notify example code
127+
// 基于 socket.io 和 JQuery来简化代码
128+
129+
var socket = io(); //开启流
130+
131+
socket.on('danmaku', function(data){
132+
// 当遇到 danmaku 事件,就把推送来的弹幕推送给 CCL
133+
var danmaku = yourFormatParser(data);
134+
CM.insert(danmaku);
135+
});
136+
137+
$('#send-danmaku-btn').click(function(){
138+
//当按了发送弹幕的按钮
139+
var data = {
140+
"text":"获取信息。。"
141+
...
142+
};// 通过UI获取新弹幕的信息
143+
144+
//包装并发射弹幕
145+
socket.emit('send-danmaku', JSON.stringify(yourFormatPackager(data));
146+
147+
//清除 UI 文字部分
148+
$('#send-danmaku-field').value("");
149+
});

docs/Intro.md

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# Introduction 入门文档
2+
入门文档设计为面向有较少 Web 或者 JS 开发经验的开发者们。如果你比较熟悉 Web 开发可以直接阅读 CCL
3+
的设计文档。
4+
5+
# 怎么架设 (Deployment)
6+
架设并开发 CCL 其实不难,首先你要确保你有一个服务器开发环境,比如在本机上安装的 Apache 或者你能访
7+
问到的在云端安装的 nginx 等等。请先通过浏览器测试你能正确访问该服务器。如果你在本地开发,请尝试访问
8+
9+
http://localhost/
10+
11+
来测试连同性。
12+
13+
**注意:** 请注意确保你在服务器环境下开发 CCL ,在开发时如果遇到各种资源无法载入,请确保您的地址栏
14+
是以 `http:` 或者 `https:` 开头的而不是 `file:` 等等。
15+
16+
**附加:** 如果你在linux下开发,任何一个静态Web服务器软件都可。Windows下开发的话,仅作为推荐参考
17+
可以试试 XAMPP。
18+
19+
### 正确的下载类库 (Getting CCL)
20+
Github 有提供以 Zip 方式下载CCL的选项,但是我们不推荐你这样做。正确使用 CCL 二次开发有两种推荐
21+
的方法:
22+
23+
- 作为外部库通过 npm 或者 bower 引入: 只需运行 `npm install comment-core-library --save`
24+
即可获取最新版的稳定CCL库。通过 `node_modules/comment-core-library/build/`
25+
可以引用需要的文件。
26+
- 直接 Clone 下 Git 代码仓库: 通过 `git clone https://github.com/jabbany/CommentCoreLibrary.git`
27+
即可 Clone下 CCL 的全代码库。建议把工作目录放到 Web 开发服务器下的子文件夹内,如 `/var/www/`
28+
或者 `D:\webroot\htdocs`下之类的。之后进入 CommentCoreLibrary 文件夹,
29+
运行 `npm install grunt-cli -g``npm install`
30+
(注意:可能需要管理员权限) 即可开始开发
31+
32+
第一个方式主要用于希望直接挂载 CCL 功能的二次开发,而第二种方式则面向对 CCL 本生的开发有兴趣的人。
33+
34+
### 正确的引用库 (Embedding CCL)
35+
CCL编译好的代码在 `build/` 目录下。有两个文件非常重要: `CommentCoreLibrary.js``style.css`
36+
这两个分别负责CCL的JS引擎部分和CSS呈现部分,不能省略。相对的还有俩 `.min.js``.min.css` 文件
37+
是上述文件的压缩版。压缩版代码都在一行,较不方便对行号调试,建议开发时采用未压缩版,架设时则可以采取
38+
压缩版。
39+
40+
引用方法为,在对应的HTML文件头部添加
41+
42+
<head>
43+
... 其他头部信息 ...
44+
<link rel="stylesheet" href="build/style.css" />
45+
<script src="build/CommentCoreLibrary.js"></script>
46+
... 其他头部信息 ...
47+
</head>
48+
49+
注意文件路径调整合理。
50+
51+
之后在相应需要弹幕的位置,放置如下 HTML DOM结构:
52+
53+
<div id='my-player' class='abp'>
54+
<div id='my-comment-stage' class='container'></div>
55+
</div>
56+
57+
其中弹幕结构会在 `container` 这个 div 里插入。采用双层嵌套可以允许你的弹幕 container 于实际容器
58+
的大小不同,用于实现避开字幕等等功能。
59+
60+
### 调用API函数 (API Calls)
61+
调用API目前来说比较容易,在建立好页面dom之后,只要绑定 CommentManager 即可。
62+
63+
var CM = new CommentManager(document.getElementById('my-comment-stage'));
64+
CM.init(); // 初始化
65+
66+
之后 `CM` 实例会提供如下功能:
67+
68+
// 载入弹幕列表
69+
var danmakuList = [
70+
{
71+
"mode":1,
72+
"text":"Hello World",
73+
"stime":0,
74+
"size":25,
75+
"color":0xffffff
76+
}
77+
];
78+
CM.load(danmakuList);
79+
80+
// 插入弹幕
81+
var someDanmakuAObj = {
82+
"mode":1,
83+
"text":"Hello CommentCoreLibrary",
84+
"stime":1000,
85+
"size":30,
86+
"color":0xff0000
87+
};
88+
CM.insert(someDanmakuAObj);
89+
90+
// 启动播放弹幕(在未启动状态下弹幕不会移动)
91+
CM.start();
92+
93+
// 停止播放(停止弹幕移动)
94+
CM.stop();
95+
96+
// 更新时间轴时间
97+
CM.time(500);
98+
CM.time(1000);
99+
100+
具体使用的参考可以参考 `demo/intro`。内有大部分此示例的代码。
101+
102+
### 发送弹幕 (Sending Comments)
103+
CCL自己没有发送弹幕的内建支持,不过实现起来非常轻松。具体实现需要根据自己服务器的需求决定。
104+
105+
### 实时弹幕 (Realtime Comments)
106+
参考[推荐的实现方法](DoingItRight.md)

docs/Readme.md

+6-28
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,19 @@ CCL包括一套尽可能完备的文档来帮助二次开发。文档主要针
44
怎么用。如果想看看现实里使用了 CCL 的项目,可以参考 [Powered By CCL](PoweredByCCL.md) 里面
55
的不完全收录。
66

7+
## 入门文档(Introduction)
8+
想开始对 CCL 的开发却还不太了解 CommentCoreLibrary?希望在自己的项目里使用 CCL 却不熟悉接口?
9+
赶紧来看[入门文档](Intro.md)
10+
711
### 部件参考(Individual Parts)
812

913
- [CommentManager 弹幕管理器](CommentManager.md)
1014
- [CommentObject 弹幕对象](CommentObject.md)
1115

1216
### 使用方法参考(Customization)
1317
理论上CCL兼容的功能非常之多,但是并不是所有的功能都在库中有实现,有关实现一些效果的较好的做法,请参考
14-
[DoingItRight 推荐使用方法](DoingItRight.md)
18+
[DoingItRight 推荐使用方法](DoingItRight.md)。里面介绍了如何优雅的实现大部分现有弹幕站点的一些
19+
附加功能,包括实时弹幕,弹幕显示格式切换,调整运动速度,全屏同步大小等等。
1520

1621
## 如何架设(How to Deploy)
1722
CommentCoreLibrary主要包括两个部分,CommentCore主体和KagerouEngine代码弹幕支持引擎。
@@ -56,30 +61,3 @@ KagerouEngine分为两个部分:JS Host和Worker Client。在编译后,分
5661
往往是绑定一个发送按钮,根据一些GUI参数确定弹幕参数跟格式,最后用Ajax派发一个POST,在收到POST结果
5762
后如果成功则显示弹幕到现在的屏幕上,这样的流程。
5863

59-
## 实时弹幕支持(Live Comments)
60-
实时弹幕也需要后端服务器的支持,而且比发送弹幕要复杂一些。实时弹幕可以采取Polling(定时读取)或者
61-
Push Notify(监听等待)两个主动和被动模式实现。实时弹幕还有绝对实时和相对性时间轴更新两个时间模式。
62-
63-
- Polling
64-
Polling是指设计的弹幕播放器定时访问服务器,询问服务器在某个弹幕池内某段时间后新产生的弹幕,然后把它
65-
添加到播放列表或者呈现出来的一种简单的模式。优点是:仅仅基于HTTP,可以在各种服务器(VPS、云、
66-
共享主机)和语言(PHP,Python,Ruby,Nodejs)上实现。缺点是:需要反复联网,效率底下,对服务
67-
器压力大。
68-
69-
推荐用于实时性不强的系统。
70-
71-
- Push Notify
72-
Push Notify是指在客户端连接到服务器的一个端口,在有新的弹幕时,服务器主动发送弹幕信息,而客户
73-
端在收到信息后被动的呈现或者更新列表。优点:速度快,效率高,处理开销低。缺点:需要用Websockets
74-
或者Flash作为桥,要么兼容性略差一点(虽然几乎现代浏览器都支持Websockets 了),要么性能不好。
75-
76-
推荐用于非常实时的系统,如不可回看的直播间等。
77-
78-
时间轴模式也不一样
79-
80-
- 绝对实时
81-
每当收到实时弹幕就直接显示,不保存或者少量保存历史弹幕,不能自由的回看。占用内存小。
82-
83-
- 实时时间轴
84-
定期更新时间轴,把弹幕按顺序正确插入,保持弹幕时间轴新鲜度,可以自由更改播放时间。
85-

0 commit comments

Comments
 (0)