1 RTP转发
event_loop不改配置,一个用户就新起了一个线程处理RTP转发。就是理清楚几个结构体之间的联系。有simulcast处理。
void janus_videoroom_incoming_rtp(janus_plugin_session *handle, janus_plugin_rtp *pkt) {
janus_videoroom_publisher *participant = janus_videoroom_session_get_publisher_nodebug(session);
janus_videoroom_publisher_stream *ps = g_hash_table_lookup(participant->streams_byid, GINT_TO_POINTER(pkt->mindex));
if(ps->active && !ps->muted) {
//走RTP举例,rtp_forward是ps->rtp_forwarders。循环发给订阅者
while(participant->udp_sock > 0 &&...){
struct sockaddr *address = (struct sockaddr *)&rtp_forward->serv_addr;
sendto(participant->udp_sock, buf, len, 0, address, addrlen);
}
}
}
2 REMB包
janus在客户端开始的时候,发4次REMB包,确定带宽。但没抓到服务器发的REMB包。
/* We send a few incremental REMB messages at startup */
janus.plugin.videoroom.jcfg配置bitrate = 128000。
bitrate = bitrate/participant->remb_startup;=128000/4=32000。
bitrate=32000 (24 bytes)
bitrate=42666 (24 bytes)
bitrate=64000 (24 bytes)
bitrate=128000 (24 bytes)
带宽计算:brMantissa * 2^ brExp。Numssrc一般为1。
客户端调节带宽发送json消息,可能是客户端没有发送RTCP包接口?
{"janus":"message","body":{"bitrate":2000000},"transaction":"aGiLtWI1Ml0R"}
客户端发送 json消息 服务器janus REMB包 其它客户端。?不如直接都REMB包方便些。
3 mute
客户端只是设置值,没有调函数使其生效。(还是我没找到)
transceiver.sender.track.enabled = mute ? false : true;
Echo Test才有enable audio/video。
1 client向janus发送json消息,2 janus向远端发送event的事件通知。
{"janus":"message","body":{"audio":false},"transaction":"J8TGbOpaonZx"}
enable video,发送请求PLI包。
Just (re-)enabled video, sending a PLI to recover it。
4 加锁
结构体janus_transport_session、janus_ice_peerconnection、janus_ice_handle、janus_videoroom、janus_videoroom_session、janus_videoroom_publisher等都有janus_mutex。
每个函数都加锁了。