Intel® Collaboration Suite for WebRTC
Community support and discussions on the Intel® Collaboration Suite for WebRTC (Intel® CS for WebRTC).

4.1 更新布局失败

yt__xia
Beginner
8,461 Views

根据文档使用 updateStream 这个接口,修改一个合成流布局

参数如下: (结果始终返回500)

[{
    "op": "replace",
    "path": "/info/layout",
    "value": [{
        "stream": "816759984407917400",
        "region": {
            "id": 3,
            "shape": "rectangle",
            "area": {
                "left": "0/2",
                "top": "0/2",
                "width": "1/2",
                "height": "1/2"
            }
        }
    }, {
        "stream": "30468870494800184",
        "region": {
            "id": 2,
            "shape": "rectangle",
            "area": {
                "left": "1/2",
                "top": "0/2",
                "width": "1/2",
                "height": "1/2"
            }
        }
    }, {
        "stream": null,
        "region": {
            "id": 1,
            "shape": "rectangle",
            "area": {
                "left": "0/2",
                "top": "1/2",
                "width": "1/2",
                "height": "1/2"
            }
        }
    }, {
        "stream": null,
        "region": {
            "id": 4,
            "shape": "rectangle",
            "area": {
                "left": "1/2",
                "top": "1/2",
                "width": "1/2",
                "height": "1/2"
            }
        }
    }]
}]

0 Kudos
17 Replies
Jinpeng_Z_Intel
Employee
8,461 Views

这里updatestream请求的request body我发现三处错误:一是,所有的id都是number,在rest文档中你会发现id只支持string;

二是,    area中的结构要合理,譬如第一个stream的布局为左上角,长宽都是1/2大小,这里的left代表的是stream距离左边边框的距离,同理top是距离上边框的距离,你这里的0/2是不符合预期的,你可以left和top都为0

三是,如果没有stream需要布局,你就没必要增加value这个数组的成员了,stream为null的是可以删除的

这是我写的一个例子,你看下共同进步:

发送PATCH stream 请求    PATCH {url}:3001/rooms/{roomId}/streams/{roomId}-common

示例Request Body如下:

[{ "op": "replace", "path": "/info/layout", "value": [{ "stream": "990136654598519300", "region": { "id": "1", "shape": "rectangle", "area": { "left": "0", "top": "0", "width": "1/2", "height": "1/2" } } }, { "stream": "362529957792808260", "region": { "id": "2", "shape": "rectangle", "area": { "left": "1/2", "top": "1/2", "width": "1/2", "height": "1/2" } } }, { "stream": "308990862608290000", "region": { "id": "3", "shape": "rectangle", "area": { "left": "1/2", "top": "0", "width": "1/2", "height": "1/2" } } }] }]

                                                                                                                                                                 谢谢

0 Kudos
Hr__Z
New Contributor I
8,461 Views

我使用manage_console更新布局不生效,重启服务器才生效,每次更新布局都需要重启服务器吗?。

0 Kudos
Jinpeng_Z_Intel
Employee
8,462 Views

通过manage_console更新页面也就是通过3300/console页面来更新布局的,不仅仅更新布局,3300/console页面上的其他操作也可以用以下方法来使其生效: 第一种,就是你发现的重启服务器,其原理就是重启服务器会把这个房间的所有操作都停止。 第二种就是直接从原理出发,把这个room上所有操作都停止,譬如有rtmp操作的调用rest API中的delete rtmp;有rtsp操作的调用rest API中的delete rtsp;有recording操作的调用rest API中的delete recording;有各种客户端接入此room的用户,可以让登录此房间的所有用户调用jssdk中leave方法。 以上是我总结的3300/console修改后使其生效的方法,有什么不完善的地方,及时指出,我们共同进步。 谢谢

0 Kudos
Jinpeng_Z_Intel
Employee
8,462 Views

通过manage_console更新页面也就是通过3300/console页面来更新布局的,不仅仅更新布局,3300/console页面上的其他操作也可以用以下方法来使其生效: 第一种,就是你发现的重启服务器,其原理就是重启服务器会把这个房间的所有操作都停止。 第二种就是直接从原理出发,把这个room上所有操作都停止,譬如有rtmp操作的调用rest API中的delete rtmp;有rtsp操作的调用rest API中的delete rtsp;有recording操作的调用rest API中的delete recording;有各种客户端接入此room的所有用户删除,可以让登录此房间的所有用户调用jssdk中leave方法。 以上是我总结的3300/console修改后使其生效的方法,有什么不完善的地方,及时指出,我们共同进步。 谢谢

0 Kudos
yt__xia
Beginner
8,462 Views

@Zhao, Jinpeng (Intel)  您好,请问下怎么在外网情况下使用外网IP,内网使用内网IP(当前的做法是修改portal.toml ip地址为外网)

修改 webrtc_agent  network_interfaces = [{name = "eth0", replaced_ip_address = "外网IP"}] 好像并不能实现内外网切换。3.5 版本这样配置同样的网络环境下只使用外网访问是正常的,4.1 同样的配置,同样的网络环境使用内网,外网均报错 ics.js:756 Uncaught (in promise) Error: ICE connection failed or closed.
    at new t (ics.js:756)
    at t.value (ics.js:534)
    at RTCPeerConnection._pc.oniceconnectionstatechange (ics.js:539)
t @ ics.js:756
value @ ics.js:534
_pc.oniceconnectionstatechange @ ics.js:539

 

希望回复,谢谢 

 

0 Kudos
Jinpeng_Z_Intel
Employee
8,463 Views

mcu所在的服务器是两个IP(网口)?还是一个IP(内网映射到外网)?

首先上述配置不能实现内外网切换。我看你两个模块的配置都是外网ip,所以只能用外网ip登录mcu,内网是不行的。

如果你是两个网口,可以尝试不配置任何东西,在内网用内网ip登录,在外网用外网ip登录,

如果你是一个ip,内网映射外网。可以尝试只配置外网ip,和你上述配置一样,网口名注意别写错了,这样内外网的client都可以用外网ip登录了;也可以尝试起两个mcu,其中一个所有模块都起来,并配置你上述配置,另外一个只启动webrtc_agent和portal两个模块,并且配置你上述配置的内网地址,这样内网ip和外网ip都能登录了,这个同样适用于双网卡的情况。

建议,配置成外网地址,这样只用外网地址登录,不用损耗多余的资源且简单明了

0 Kudos
yt__xia
Beginner
8,463 Views

Zhao, Jinpeng (Intel)

 非常感谢,配置外网,并开放UDP 端口,以及可以正常使用了。另外,想了解下 一个MCU编码能力不够,如何通过增加MCU编码服务器,而不修改API调用方式进行多个编码单元集群使用呢?

0 Kudos
Jinpeng_Z_Intel
Employee
8,463 Views

mcu支持分布式部署,上述问题可以增加video_agent来解决

0 Kudos
yt__xia
Beginner
8,463 Views

Zhao, Jinpeng (Intel)  使用 rest 接口 updateStream 修改 音视频状态后, js 客户端用什么消息可以接受到变化呢? 尝试使用单流对象监听 update activeaudioinputchange  都没反应。

0 Kudos
Jinpeng_Z_Intel
Employee
8,463 Views

当用rest接口updateStream使audio、video的状态改变为有效或者无效的时候,会触发Publication和Subscription中的mute或者unmute事件。

0 Kudos
yt__xia
Beginner
8,463 Views

then((subscription) => {

subscription.addEventListener("mute", (event) => {

    console.log('Subscription mute: ' + event);

})

是这样使用的吗? 通过 rest 修改  subscript audio 和 video 音视均被关闭 但是  mute 消息始终能接受到。是不是用法不对呢,看文档也没找到相关用法。

 

使用非mix 进行 subscribe 并监听  mute 是可以正常接受到消息的。(如果每个子流都subscribe 合成流也进行 subscribe 是不是占用n+1路的带宽呢)

我使用的合成场景,需要知道合成中某个流通过rest关闭了视频的消息。 希望回复,谢谢!

0 Kudos
Jinpeng_Z_Intel
Employee
8,463 Views

首先合成流(mix流)中的一个流通过rest改变了audio或video的状态时,都会触发mute或unmute事件的

也就是说,上述用法是正确的,也能达到你的目的(某流改变状态后,你能得到信息)。当然你可以使用event.kind来输出具体改变了audio还是video的状态。

当通过rest关闭audio和video后,Publication和Subscription调用mute方法还是可以接受到mute事件的。

mute事件的定义是client/remote停止发送audio/video时触发

unmute事件的定义是client/remote继续发送audio/video时触发

所以无论是restAPI中改变某个流的video或audio的状态,还是Publication和Subscription调用mute方法,都会触发mute/unmute

0 Kudos
yt__xia
Beginner
8,464 Views

then((subscription) => {

subscriptionForMixedStream = subscription;

$('.remote video').get(0).srcObject = stream.mediaStream;

subscription.addEventListener('error', (err) => {

console.log('Subscription error: ' + err.error.message);

})

 

subscriptionForMixedStream.addEventListener("mute", (event) => {

console.log('Subscription mute: ' + event);

})

 

使用 subscriptionForMixedStream 监听 mute 用 rest 控制 subscrip 里面的音视值,收不到任何消息。

0 Kudos
Jinpeng_Z_Intel
Employee
8,464 Views

sub的是mix流还是forward流?forward流能够触发mute事件,mix的话不能触发mute事件。

1、then后的括号貌似少了一个,2、subscription没有error这个事件吧。重新sub一个forward流,然后试试以下代码:

.then((subscription) => {
subscription.addEventListener("mute", (event) => {
console.log(`Subscription ${subscription.id} muted + event.kind`);
})
)

0 Kudos
yt__xia
Beginner
8,464 Views

Zhao, Jinpeng (Intel)

您好,动态切换布局按照您说的方式已经调测正常了。我想请问下,调用修改布局后,如何恢复到默认布局呢?(默认是自动变化,但是设置后,指定2个画面,大于2个视频就无法显示出来了)

0 Kudos
Hr__Z
New Contributor I
8,464 Views

Zhao, Jinpeng (Intel) wrote:

这里updatestream请求的request body我发现三处错误:一是,所有的id都是number,在rest文档中你会发现id只支持string;

二是,    area中的结构要合理,譬如第一个stream的布局为左上角,长宽都是1/2大小,这里的left代表的是stream距离左边边框的距离,同理top是距离上边框的距离,你这里的0/2是不符合预期的,你可以left和top都为0

三是,如果没有stream需要布局,你就没必要增加value这个数组的成员了,stream为null的是可以删除的

这是我写的一个例子,你看下共同进步:

发送PATCH stream 请求    PATCH {url}:3001/rooms/{roomId}/streams/{roomId}-common

示例Request Body如下:

[{ "op": "replace", "path": "/info/layout", "value": [{ "stream": "990136654598519300", "region": { "id": "1", "shape": "rectangle", "area": { "left": "0", "top": "0", "width": "1/2", "height": "1/2" } } }, { "stream": "362529957792808260", "region": { "id": "2", "shape": "rectangle", "area": { "left": "1/2", "top": "1/2", "width": "1/2", "height": "1/2" } } }, { "stream": "308990862608290000", "region": { "id": "3", "shape": "rectangle", "area": { "left": "1/2", "top": "0", "width": "1/2", "height": "1/2" } } }] }]

                                                                                                                                                                 谢谢

 

V4.2.1版本,使用http request请求进行LayoutUpdate,服务器返回OK,但是布局的行为和默认房间的布局行为相同,也就是说自己设置的布局位置不生效,请问还需要进行其他设置吗?

谢谢。

0 Kudos
Jinpeng_Z_Intel
Employee
8,465 Views

其他设置不需要,我这边是成功的,你是按照我写的body发送的请求吗?流id改了吗?

0 Kudos
Reply