licode API (译文)

概览:

Api在浏览器中使用,作为一种javascript文件提供使用,可以在你的web应用中直接调用。

典型的使用组合:想要连接的房间,使用后端函数,管理本地音视频,客户端事件管理等等。

客户端API类列表

类名 描述
Erizo.Stream 在LicodeRoom提供本地和远程视频流,音频流和数据流
Erizo.Room 描述LicodeRoom,提供连接,本地流发布和远程流订阅
Erizo.Event 一系列不同类型消息,它代表一个通用事件

Erizo.Stream

它处理webRTC的音视频流和数据流,在适当位置绘制。

这些数据流可以是本地或远程。Licode内部提供创建远程流通过Erizo.Room API

它通过stream.getID()识别每个本地和远程流,它通过stream.paly()控制在html中图像绘制(只有他们在音视频流中);

你需要在Room中使用流之前初始化这些流,通常流的初始化如下:

<code>

var stream = Erizo.Stream({audio:true, video:false, data: true, attributes: {name:’myStream’}});

</code>

如果你想要在room中发布视频,音频和数据,则这些视频、音频和数据变量必须被设定为true。同时attributes变量可以存储额外的与流相关的信息。这些信息可以在客户端和room中共享。

如果你想要使用一个流共享你的屏幕,你应该像这样初始化:

<code>

var stream = Erizo.Stream({screen: true, data: true, attributes: {name:’myStream’}});

</code>

注意,你按上述方法使用一个流,将要共享屏幕的客户端必须是安全连接(https协议)而且使用屏幕共享插件(http://lynckia.com/licode/plugin.html)。

当创建一个流的时候,你也可以指定视频大小限制。为了这样做,你需要包含上videoSize参数,它是一个如下数组[minWidth,minHeight,maxWidth,

maxHeight],则初始化如下:

<code>

var stream = Erizo.Stream({video: true, audio: true, videoSize: [320, 240, 640, 480]});</code>

你可以创建一个流发布到外部licode会话上。在这点上,RTSP和文件都是支持的,基于codec文件。你可以创建一个外部流通过使用url变量。例如从rtsp源上创建一个流:

<code>

var stream = Erizo.Stream({video: true, audio: false, url:”rtsp://user:pass@the_server_url:port”});

</code>

或者从.mkv文件创建一个流

var stream = Erizo.Stream({video: true, audio: false, url:”file:///path_to_file/movie.mkv”});

你可以得到以下变量在一个流对象中:

  • showing检测流是否是本地正在播放的音视频
  • room可以知道连接的room
  • local可以知道流是本地还是远程的

接下来这张表可以知道stream类的函数:

 

function 描述
hasAudio() 流是否有激活的视频
hasVideo() 流是否有激活的音频
hasData() 流是否有激活的数据
Init() 初始化本地流
Close() 关闭本地流
Play(elementID,option) 在html中显示视频
Stop() Html中移除视频
sendData(msg) 通过流向订阅的客户端发送数据
getAttributes() 当创建流的时候,得到属性变量并保存
setAttributes() 设定分享到Room的本地流新的属性
getVideoFrame() 从视频中得到位图
getVideoFrameURL() 从视频中得到位图的URL

检测流中是否有激活的视频、音频和数据

你可以通过一下函数检测流中是否有激活的视频、音频和数据。例子如:

  1. stream.hasAudio();
  2. stream.hasVideo();
  3. stream.hasData();

初始化流

初始化流和从本地音视频中检索一个流(以防你激活他们)。

你需要在将流发布到room或者在本地播放之前调用这个方法。

例子:你首先要创建流然后需要初始化它(line1)。然后需要添加一个监听事件区知道何时用户授权使用摄像头和麦克风(line2)。你将会收到

access-accepted’或’access-denied ’消息。

  1. stream.init();
  2. stream.addEventListener(‘access-accepted’,function(event) {
  3. console.log(“Access to webcam and microphone granted”);
  4. });
  5. stream.addEventListener(‘access-denied’,function(event) {
  6. console.log(“Access to webcam and microphone rejected”);
  7. });

关闭本地流

如果流中有音视频,这个函数也将关闭摄像头和麦克风。

如果流被推送到了room,这个函数也将停止推送。

如果流在div中播放,这个函数也将停止其播放。

例子:你可以关闭一个曾经初始化的本地流,代码如下:

  1. stream.close();

在html中播放本地流

给定elementID就可以开始播放音视频。它自动创建一个音视频的html标签。

例子:只有当已将收到access-accepted消息后,才可以播放音视频。需要通过elementID作为参数。通过option参数可以控制声音滑块的隐藏。

  1. stream.play(elementID,{speaker: false});

例子:默认情况下视频流会自动适应div,但是有时视频会被剪一些。如果你不想视频被剪,你可以做如下设置:

  1. stream.play(elementID,{crop: false});

从html中消除本地视频

例子:你可以在html中停止音视频的播放,代码如下:

  1. stream.stop();

通过流发送数据

通过流发送信息,所有被订阅过的用户将会收到此信息。

例子:客户端可以发送任何json序列化过的消息,这个消息将会通过流的stream-data事件接收到。所有所有的客户端应该被订阅。

  1. stream.sendData({text:’Hello’,timestamp:12321312});

得到属性对象

得到用户存储的或者更新的流的属性对象。

例子:属性变量通常是json对象

  1. varstream = Erizo.Stream({audio:true, video:false, data: true, attributes: {name:’myStream’, type:’public’}});
  2. varattributes = stream.getAttributes();
  3. if(attributes.type ===’public’) {
  4. console.log(attributes.name);
  5. }
  6. stream.addEventListener(“stream-attributes-update”,function(evt) {
  7. varstream = evt.stream;
  8. // Handle stream attribute event.
  9. });

 

得到一帧视频

从视频中得到一帧的图像。

例子:客户端能从视频流中得到原始位图数据。流返回位图数据。你可以把它放在canvas标签中。如果你想要得到定期不停的得到图像可以设置一个时间间隔。

  1. varbitmap;
  2. varcanvas = document.createElement(‘canvas’);
  3. varcontext = canvas.getContext(‘2d’);
  4. canvas.id =”testCanvas”;
  5. document.body.appendChild(canvas);
  6. setInterval(function(){
  7. bitmap =stream.getVideoFrame();
  8. canvas.width =bitmap.width;
  9. canvas.height =bitmap.height;
  10. context.putImageData(bitmap,0, 0);
  11. },100);

Erizo.Room

它提供了一个licodeRoom,它处理连接,本地流推送和远程流订阅。

典型Room初始化如下:

  1. varroom = Erizo.Room({token:’213h8012hwduahd-321ueiwqewq’});

它将会通过这个用户层收到的标记(token)来创建一个room对象。这个标记必须是服务器API返回的,因为这是一个用户的存取标记。但是你需要调用连接函数连接这个Room。

你可以获取以下变量:

  • localStreams:在Room中检索当前列表中的本地流变量
  • remoteStreams:返回Room中当前列表里的远程流变量
  • roomID:房间标识符
  • state:当前房间状态。如果没有连接状态可以是0,如果正在连接或已经连上则状态是2.

Room的函数:

connect() 建立与Room的连接
publish(stream) 发布流
subscribe(stream) 订阅远端的流
unsubscribe(stream) 取消订阅流
unpublish(stream) 取消发布流
disconnect() 断开与room的连接
startRecording(stream) 开始录制流
stopRecording(recordingId) 通过recordingId停止录制流
getStreamByAttribute(name,value) 返回指定了属性的远端流列表

打开一个到房间的连接

建立到房间的连接。这个函数是异步的,所以需要添加一个事件监听去知道何时连接上了room。它会抛出room-connected事件。

例子:这个room通过有效的标志(token)建立。然后我们连接到这个room(line1),同时添加事件监听,等待连接建立(line2)。请注意,不能对room做任何操作直到接收到这个事件。

  1. room.connect();
  2. room.addEventListener(“room-connected”,function(event) {
  3. console.log(“Connected!”);
  4. });

发布本地流

根据给定的流参数,发布本地流。客户端应该先初始化流再连接room。当调用这个函数时就开始给licode room发送音/视频流。流准备好后这个room的所有用户都将收到stream-add事件,事件中有你的流信息,其他用户可以订阅它。

例子:首先你需要创建并初始化一个流然后连接room。接下来为了发布流你需要把流交给room(line1)。当轮流最终发布到room后抛出stream-add事件,因为流被添加进了room。必须添加事件监听去处理它(line2),然后检查这个流是否是你刚刚发布的(line3)。

  1. room.publish(localStream);
  2. room.addEventListener(“stream-added”,function(event) {
  3. if (localStream.getID() === event.stream.getID()) {
  4. console.log(“Published!!!”);
  5. }
  6. });

Room.publish也允许对本地流设置带宽限制,通过maxVideoBW参数设置,带宽单位为Kbps。注意,服务器端带宽设置config.erizoController.defaultVideoBW的优先级较高。

  1. room.publish(localStream,{maxVideoBW:300});

订阅一个远程流

在room中订阅一个远程流,需要你首先连接room然后知道room中的哪个流是可订阅的。如前文所述我们已经添加了stream-add事件监听。在这里我们收到的事件中将有stream对象参数。

例子:首先连接room,然后收到你想要订阅的流的事件。注意,你可以订阅你发布的流,但是你将会收到会有时延。我们建议你使用streamAPI直接播放你的本地流。

  1. room.addEventListener(“stream-subscribed”,function(streamEvt) {
  2. console.log(“Stream subscribed”);
  3. });
  4. room.subscribe(stream);

例子:你可以通过subscribe参数选择你想要订阅的音频或视频流。这个例子就是只订阅音频。

  1. room.addEventListener(“stream-subscribed”,function(streamEvt) {
  2. console.log(“Stream subscribed”);
  3. });
  4. room.subscribe(stream,{audio: true, video: false});

取消订阅远程流

你可以取消已经订阅的远程流,要求通订阅相似。

例子:你首先必须订阅过流。当你取消订阅时,html上的对应元素将被清空。

  1. room.unsubscribe(stream);

取消订阅本地流

当你连接到room并正在发布本地流时,你可以通过stream取消你的流。要求与订阅流相似。当你的流取消发布时,Room将向所有用户抛出stream-remove事件。

例子:首先你需要发布本地流,然后你任意时间可以取消发布你的流(line1)。当你收到stream-removed事件时,你可以确定你的流没有被发布(line2-3)。

  1. room.unpublish(localStream);
  2. room.addEventListener(“stream-removed”,function(event) {
  3. if(localStream.getID() === event.stream.getID()) {
  4. console.log(“Unpublished!!!”);
  5. }
  6. });

room断开连接

当你需要的时候可以与room断开连接。Room将会抛出room-disconnected事件。

例子:

  1. room.disconnect();

开始录制

开始在服务端由licode-config.js指定的路径录制流。录制的内容将以.mkv格式并以VP8编解视频以PCMU或OPUS编解音频,这取决于服务器端的设置。录制的文件可以直接播放或者以流的形式在room中播放。Licode将会一直录制直到调用停止录制或者被录制的流退出了房间。

例子:开始录制本地流

  1. room.startRecording(localStream,function(recordingId) {
  2. console.log(“Recording started, the id of the recording is “,recordingId);
  3. });

停止录制

停止某个流的录制,你必须提供录制的id号:recordingId。

例子:停止录制

  1. room.stopRecording(recordingId);

播放录制的流

有两种方式播放录制的流,这两种方式都需要外部流的参与,你可以设置url参数指定录制的路径或使用recordingId。

例子:从url指定的路径中播放录制或者使用recordingId。

  1. varstream = Erizo.Stream({video: true, audio: false, url:”file:///path_to_file/previousRecording.mkv”});
  2. room.publish(stream);
  3. varstream2 = Erizo.Stream({audio:true, video:true, recording: ‘asda2131231′});
  4. room.publish(stream2);

通过属性得到流

你可以通过属性找到流,一个远程流也是一个你曾订阅过的room流。

例子:如果你想通过’public’属性得到流

  1. varstreams = room.getStreamsByAttribute(‘type’, ‘public’);
  2. //streams is an array that contains the stream objects.

 

事件处理

Room继承于EventDispatcher(可以通过event章节得到更多信息),处理RoomEvent和StreamEvent。例如:

  • 事件’room-connected’表明用户成功连接到room;
  • 事件’room-disconnected’表明用户已经与room断开连接;
  • 事件’stream-added’表明room中加入了新的流;
  • 事件’stream-removed’表明之前的某个流离开了room;

当客户端处于连接状态中就可以收到任意事件。

例子:尽管我们已经举了一些关于事件监听的例子,这里强烈建议在room中做任何操作之前,添加事件监听。

  1. varroom = Room({token:”…”});
  2. room.addEventListener(“room-connected”,function(evt){…});
  3. room.addEventListener(“room-disconnected”,function(evt){…});
  4. room.addEventListener(“stream-added”,function(evt){…});
  5. room.addEventListener(“stream-removed”,function(evt){…});
  6. room.connect();

Erizo.Ewents

Licode提供了一系列事件类去处理客户端的连接的状态变化。Room和Stream类抛出不同的licode event(这就是EventDispatcher)并需要为他们添加事件监听。这里介绍licode事件的不同类型。下表有个简要的描述。

描述
Licode Event 代表在库中继承于其他类的通用事件
Room Event 代表与room连接相关联的事件
Stream Event 代表与在room中的流相关联的事件

 

 

Licode Event

它处理事件类型非常重要,主要处理添加EventDispather事件监听和分发新事件。

例子:一个licodeEvent可以如下初始化,但它通常被客户端API创建。

  1. varevent = Erizo.LicodeEvent({type: “room-connected”});

Room Event

它代表连接和断开事件。你可以获得连接到一个room中的所有流的列表,通过roomEvent.stream。这是room事件的列表:

  • room-connected:指出用户已经成功连接到room,这个消息也提供了发布到room中的所有流列表。
  • room-disconneted:表明用户已经与room断开连接。

他们都是通过room对象发送出去的。

例子:一个RoomEvent初始化如下,但是他通常被Room对象创建。

  1. varroomEvent = Erizo.RoomEvent({type:”room-connected”, streams:[stream1, stream2]});

 

例子:他们都是Room对象发送出去的,所有你需要给他们添加事件监听。

  1. room.addEventListener(“room-connected”,function(evt){…});

Stream Event

它代表stream相关的事件。你可以通过streamEvent.stream获得相关的流。以下是不同类型的stream事件:

  • access-accepted:表明用户同意使用摄像头和麦克风;
  • access-denied:表明用户拒绝使用摄像头和麦克风;
  • stream-added:表明room中有新的流添加进来;
  • stream-removed: 表明room中有一个流离开;
  • stream-data:在流中收到新数据
  • stream-attributes-update:通知流的拥有者这个流的属性被更新了;

他们通过Room对象发送。

例子:StreamEvent如下被初始化,但是它通常被客户端API创建。

var streamEvent = Erizo.StreamEvent({type:”stream-added”, stream:stream1});

例子:stream-added和stream-removed都是Room对象发送的,所有你需要给他们添加事件监听。

  1. room.addEventListener(“stream-removed”,function(evt){…});

例子:access-accepted, stream-data和stream-attributes-update都是Stream对象发送的,所有你需要给这些事件添加监听函数。

  1. stream.addEventListener(“access-accepted”,function(evt){…});
  2. stream.addEventListener(“stream-data”,function(evt){
  3. console.log(‘Received data ‘,evt.msg, ‘from stream ‘, evt.stream.getAttributes().name);
  4. });
  5. room.addEventListener(“stream-attributes-update”,function(evt){…});

例子

这里展示典型用户的一些例子和代码片段,这些代码使用了这个API中几乎所有的部分。

例子:基本的视频会议功能。这里每个客户端连接room将要发布自己的视频和音频,订阅其他所有用户的音频和视频。这个例子使用了唯一的room。

  1. <html>
  2. <head>
  3. <title>Licode Basic Example</title>
  4. <scripttype=”text/javascript” src=”erizo.js”></script>
  5. <scripttype=”text/javascript”>
  6. window.onload =function () {
  7. varlocalStream = Erizo.Stream({audio: true, video: true, data: true});
  8. varroom = Erizo.Room({token: “af54/=gopknosdvmgiufhgadf==”});
  9. localStream.addEventListener(“access-accepted”,function () {
  10. //同意使用摄像头和麦克风
  11. varsubscribeToStreams = function (streams) {
    1. for(var index in streams) {
      1. varstream = streams[index];
      2. if(localStream.getID() !== stream.getID()) {
      3. room.subscribe(stream);
      4. }
    2. }
  12. };
    1. room.addEventListener(“room-connected”,function (roomEvent) {
    2. // 连接到room
    3. room.publish(localStream);//发布本地流
    4. subscribeToStreams(roomEvent.streams);//订阅所有用户
    5. });
    1. room.addEventListener(“stream-subscribed”,function(streamEvent) {
    2. //订阅远程流
    3. varstream = streamEvent.stream;
    4. vardiv = document.createElement(‘div’);
    5. div.setAttribute(“style”,”width: 320px; height: 240px;”);
    6. div.setAttribute(“id”,”test” + stream.getID());
    7. document.body.appendChild(div);
    8. stream.play(“test”+ stream.getID());
    9. });
    1. room.addEventListener(“stream-added”,function (streamEvent) {
    2. //room中有新的流加入
    3. varstreams = [];
    4. streams.push(streamEvent.stream);
    5. subscribeToStreams(streams);
    6. });
    1. room.addEventListener(“stream-removed”,function (streamEvent) {
    2. // Remove stream from DOM
    3. varstream = streamEvent.stream;
    4. if(stream.elementID !== undefined) {
    5. varelement = document.getElementById(stream.elementID);
    6. document.body.removeChild(element);
    7. }
    8. });
    1. room.connect();
    2. localStream.play(“myVideo”);
    3. });
  13. localStream.init();
  14. };
  15. </script>
  16. </head>
  17. <body>
  18. <divid=”myVideo” style=”width:320px; height: 240px;”>
  19. </div>
  20. </body>
  21. </html>

Node.js client

在你的node.js应用中使用这里介绍的API运行erizo客户端。你可以连接room,发布和订阅流,管理事件。你只需要引入erizofc.js,代码如下:

  1. varErizo = require(‘.erizofc’);

现在你可以使用API调用Erizo.RoomErizo.Stream 和Erizo.Events.注意你可以不订阅或不发布音视频流。

 

 

 

服务器通过Nuve API 创建聊天室,用户则通过Erizo API连接这些聊天室。Erizo Controller 用来管理聊天室,即通过Erizo API管理流文件。

 

READ MORE

Licode后台服务

Licode server-API都是异步回调函数,回调函数的执行都是不同步的。例如我需要删除之前的会议室然后创建需要的会议室时,需要同步操作即要保证之前的会议室删除完毕后,再创建新会议室。使用递归函数:

function initRoom(){

N.API.getRooms(function(roomlist){

console.log(“get room list:”,roomlist);

var rooms = JSON.parse(roomlist);

var count = rooms.length;

if(count>0){

var roomId = rooms[count-1]._id;

N.API.deleteRoom(roomId, function(result){

var printId = roomId;

console.log(‘delete roomID:’,printId);

initRoom();

});

}

else {

createRooms();

return;

};

});

}

function createRooms(){

switch(createId)

{

case 0:{

N.API.createRoom(‘videoRoom’, function(roomID) {

roomList[0]=roomID._id;

console.log(‘Created video room and id :’, roomList[0]);

createId++;

createRooms();

},errorCallback);

break;

}

case 1:{

N.API.createRoom(‘videoRoom-p2p’, function(roomID) {

roomList[1]=roomID._id;

console.log(‘Created videoRoom-p2p and id is ‘, roomList[1]);

createId++;

createRooms();

},errorCallback, {p2p: true});

break;

}

defalut:{break;return;}

}

 

}

READ MORE

licode前端代码分析

视频交互

  • 初始化本地流localStream = Erizo.Stream(config);
  • 使用XMLHttpRequest,从服务器端获取room的token,初始化Room

room = Erizo.Room({token: token});

  • 监听摄像头允许消息:

localStream.addEventListener(“access-accepted”,function)

4.摄像头允许后,添加Room消息的监听:

room.addEventListener(“room-connected”, function(){表示Room连接成功

发布本地流到Room,订阅Room中的其他流})

room.addEventListener(“stream-subscribed”,function(){表示流订阅成功

显示订阅到的流})

room.addEventListener(“stream-added”,function(){表示有流加入到Room

订阅新加入的流})

room.addEventListener(“stream-removed”,function(){表示有流离开Room

删除此流对应的显示})

  1. 连接房间:

room.connect();

  1. 播放本地视频:

localStream.show(“myVideo”);

 

room.connect()触发room.conneced消息

Stream.publish()触发 stream-added消息

Stream.subscribe()触发 stream-subscribed 消息

消息都是服务器发送过来的。

文本消息

  1. 发送消息:sendData({msg: messText.value, name: my_name});
  2. 接收消息:在收到表示流订阅成功的stream-subscribed消息后,加入数据监听:

stream.addEventListener(“stream-data”,chat_message_received);

在收到”stream-data”消息后,表示收到数据,

chat_message_received = function(evt) {

var msg = evt.msg;

add_text_to_chat(msg.name + ‘: ‘, ‘name’);//发送用户名

add_text_to_chat(msg.msg, ”);//发送的数据

}

用户列表和系统消息

1.在收到表示流订阅成功的stream-subscribed消息后,从

stream.getAttributes().name获取当前流的用户名(用户名设置在初始化流时设置:

var config = {audio: true, video: true, data: true,attributes: {name: userName}};

Erizo.Stream(config))

  • 在所有stream消息后,将消息显示在前端页面。

Licode测试bug

如果服务器开启2个网卡,一个网卡是有线,一个是WiFi,则客户端访问出现异常,异常情况1.room.publish()之后,收不到stream-added的消息

  • 收到stream-subscribed消息之后,视频流看不到,如图所示:

这些情况不一定在所有客户端出现。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值