Google chrome 处理chrome';s rtp流?
我正在使用webrtc将网络摄像头从浏览器流式传输到服务器,在服务器上可以执行以下设置:Google chrome 处理chrome';s rtp流?,google-chrome,webrtc,rtp,janus-gateway,Google Chrome,Webrtc,Rtp,Janus Gateway,我正在使用webrtc将网络摄像头从浏览器流式传输到服务器,在服务器上可以执行以下设置: 使用firefox和修改后的echo测试html,我将网络摄像头流发送到janus服务器 janus服务器正在使用一个修改过的echotest插件运行,该插件只是将janus_videorecv_incoming_rtp()中给定的char*buf通过udp流传输到端口5060,仅用于测试目的() 下面的gstreamer命令行实际上打开了一个显示流式视频的窗口 GST_DEBUG=p*:5 GST-lau
GST_DEBUG=p*:5 GST-launch-1.0-vvv udpsrc caps=“应用程序/x-rtp,媒体=视频,时钟频率=90000,有效负载=96”端口=5060!rtpvp8depay!vp8dec!自动视频接收器
在修改后的echo测试javascript中,我从sdp答案中删除了几行,浏览器将收到如下结果:
//jsep.sdp = jsep.sdp.replace(/a=rtcp-mux[^\s]*\s*/g, '');
jsep.sdp = jsep.sdp.replace(/a=rtpmap[^\s]*\s*red[^\s]*\s*/g, '');
jsep.sdp = jsep.sdp.replace(/a=rtpmap[^\s]*\s*ulpfec[^\s]*\s*/g, '');
jsep.sdp = jsep.sdp.replace(/a=fmtp[^\r\n]*\r*\n*/g, '');
jsep.sdp = jsep.sdp.replace(/a=rtcp-fb[^\s]*\s*goog-remb[^\s]*\s*/g, '');
下面,您可以找到修改后的FirefoxSDP答案,它适用于上面的gstreamer命令
但同样,修改后的sdp答案在chrome上也不起作用
我曾想过调整gstreamer封盖中的有效载荷,但32,33,96100120不起作用
所以问题是:在使用chrome的情况下,需要什么才能让它正常工作
我还尝试添加fir/pli请求,比如来自janus的videoroom.c中的请求
对于chrome,gstreamer输出为,其中命令仅在最后一行保持等待:
0:00:00.025791492 22279 0x1954b90 DEBUG pipeline gstpipeline.c:219:gst_pipeline_init:<GstPipeline@0x1962180> set bus <bus2> on pipeline
Setting pipeline to PAUSED ...
0:00:00.029798090 22279 0x1954b90 DEBUG pipeline gstpipeline.c:282:reset_start_time:<pipeline0> reset start_time to 0
Pipeline is live and does not need PREROLL ...
/GstPipeline:pipeline0/GstUDPSrc:udpsrc0.GstPad:src: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, payload=(int)96, encoding-name=(string)VP8-DRAFT-IETF-01
Setting pipeline to PLAYING ...
0:00:00.030045034 22279 0x1954b90 DEBUG pipeline gstpipeline.c:377:gst_pipeline_change_state:<pipeline0> selecting clock and base_time
0:00:00.030053523 22279 0x1954b90 DEBUG pipeline gstpipeline.c:398:gst_pipeline_change_state:<pipeline0> Need to update start_time
0:00:00.030058181 22279 0x1954b90 DEBUG pipeline gstpipeline.c:403:gst_pipeline_change_state:<pipeline0> Need to update clock.
/GstPipeline:pipeline0/GstRtpVP8Depay:rtpvp8depay0.GstPad:src: caps = video/x-vp8, framerate=(fraction)0/1
/GstPipeline:pipeline0/GstVP8Dec:vp8dec0.GstPad:sink: caps = video/x-vp8, framerate=(fraction)0/1
0:00:00.030111345 22279 0x1954b90 DEBUG pipeline gstpipeline.c:443:gst_pipeline_change_state:<pipeline0> start_time=0:00:00.000000000, now=33:52:04.529345754, base_time 33:52:04.529345754
/GstPipeline:pipeline0/GstRtpVP8Depay:rtpvp8depay0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, payload=(int)96, encoding-name=(string)VP8-DRAFT-IETF-01
New clock: GstSystemClock
firefox回答:
v=0
o=Mozilla-SIPUA-32.0.3 11426 0 IN IP4 127.0.0.1
s=SIP Call
t=0 0
a=group:BUNDLE audio video
a=msid-semantic: WMS janus
m=audio 1 RTP/SAVPF 109 0 8 101
a=mid:audio
c=IN IP4 192.168.0.1
a=sendrecv
a=rtcp-mux
a=ice-ufrag:BRBU
a=ice-pwd:2W4fGNr//HejhiC4UIabW6
a=ice-options:trickle
a=fingerprint:sha-256 C5:5F:DA:7D:84:47:B1:BF:6B:55:16:62:48:31:3E:D3:F1:7B:25:89:92:4A:4B:4D:4D:D9:D5:AF:EA:D8:15:44
a=setup:active
a=connection:new
a=rtpmap:109 opus/48000/2
a=ptime:20
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=ssrc:3725983979 cname:janusaudio
a=ssrc:3725983979 msid:janus janusa0
a=ssrc:3725983979 mslabel:janus
a=ssrc:3725983979 label:janusa0
a=candidate:1 1 udp 2013266431 192.168.0.1 56574 typ host
m=video 1 RTP/SAVPF 120
a=mid:video
c=IN IP4 192.168.0.1
a=sendrecv
a=rtcp-mux
a=ice-ufrag:jZ5b
a=ice-pwd:dQQej9UIpPl5zuXBQNg3Nz
a=ice-options:trickle
a=fingerprint:sha-256 C5:5F:DA:7D:84:47:B1:BF:6B:55:16:62:48:31:3E:D3:F1:7B:25:89:92:4A:4B:4D:4D:D9:D5:AF:EA:D8:15:44
a=setup:active
a=connection:new
a=rtpmap:120 VP8/90000
a=rtcp-fb:120 nack
a=rtcp-fb:120 nack pli
a=rtcp-fb:120 ccm fir
a=ssrc:1425382999 cname:janusvideo
a=ssrc:1425382999 msid:janus janusv0
a=ssrc:1425382999 mslabel:janus
a=ssrc:1425382999 label:janusv0
a=candidate:2 1 udp 2013266431 192.168.0.1 39063 typ host
m=application 0 DTLS/SCTP 0
c=IN IP4 192.168.0.1
更新:
我修改了sdp的答案,使firefox和chrome的答案几乎相同
除了我刚刚从sdp报价中复制的“o=”和“s=”行
v=0
o=-7589782217972865757 2英寸IP4 127.0.0.1
=-
t=0
a=组:捆绑音频视频
a=msid语义:WMS janus
m=音频1 RTP/SAVPF 111
a=中间:音频
c=在IP4 192.168.0.1中
a=sendrecv
a=rtcp多路复用器
a=冰抹布:g0kZ
a=ice pwd:d5oEody1jqIzDYUdf1fg6t
a=冰选项:涓流
a=指纹:sha-256 C5:5F:DA:7D:84:47:B1:BF:6B:55:16:62:48:31:3E:D3:F1:7B:25:89:92:4A:4B:4D:4D:D9:D5:AF:EA:D8:15:44
a=设置:激活
a=连接:新
a=rtpmap:111 opus/48000/2
a=ssrc:1038736511 cname:janusaudio
a=ssrc:1038736511 msid:janus janusa0
a=ssrc:1038736511 mslabel:janus
a=ssrc:1038736511标签:janusa0
a=候选:1 udp 2013266431 192.168.0.1 51232典型主机
m=视频1 RTP/SAVPF 100
a=mid:视频
c=在IP4 192.168.0.1中
a=sendrecv
a=rtcp多路复用器
a=冰抹布:g0kZ
a=ice pwd:d5oEody1jqIzDYUdf1fg6t
a=冰选项:涓流
a=指纹:sha-256 C5:5F:DA:7D:84:47:B1:BF:6B:55:16:62:48:31:3E:D3:F1:7B:25:89:92:4A:4B:4D:4D:D9:D5:AF:EA:D8:15:44
a=设置:激活
a=连接:新
a=rtpmap:100 VP8/90000
a=rtcp fb:100 ccm fir
a=rtcp fb:100纳克
a=rtcp fb:100 nack pli
a=rtcp fb:100 goog remb
a=ssrc:2455978689 cname:janusvideo
a=ssrc:2455978689 msid:janus janusv0
a=ssrc:2455978689 mslabel:janus
a=ssrc:2455978689标签:janusv0
a=候选:1 udp 2013266431 192.168.0.1 51232典型主机
m=应用程序0 DTLS/SCTP 0
c=在IP4 192.168.0.1中
WebRTC使用DTLS-SRTP强制加密(Chrome仍然支持非标准和明确的不得执行SDES密钥)
您不能只向webrtc提供RTP流;它必须是具有初始DTLS连接的DTLS-SRTP流
人们已经将node.js连接到webrtc浏览器上,所以我想你需要的所有机器都在那里。Kurento Media Server(KMS)是一个完全写在GStreamer之上的webrtc媒体服务器。KMS提供了一个WebRTC端点,实现了向web浏览器发送/接收WebRTC流所需的所有协议和算法。KMS公开了基于媒体元素和媒体管道的API,并将其转换为GStreamer媒体管道。通常,您在GStreamer上拥有的所有功能也可以在KMS中使用。您可以在中查看KMS
免责声明:我是Kurento开发团队的一员。我已经更新了我的fork,其中包含一个有效的示例(我已经在debian jessie上进行了测试) 以下是我对你的插件更改的建议
rtpbin
gstreamer元素来处理传入流。由于某些原因,设置上限的方式实际上不起作用,管道将崩溃。如果您确实获得了rtp数据包,并且能够将它们发送到端口,那么以下管道将正常工作:gst-launch-1.0 udpsrc port=caps=“application/x-rtp,时钟速率=90000,负载=100”!rtpvp8depay!vp8dec!自动视频接收器同步=假异步=假
从理论上讲,直接将缓冲区推送到插件中的appsrc也应该起作用 在chrome中,并非所有映射都被删除。为什么要删除
a=rtcp fb:100 goog remb
?更正视频媒体线路上显示的rtp有效负载,并删除未指定的rtx
rtp映射。这会让你在这条路上走得更远。你确定chrome会给你发送媒体吗?我猜它在回答时会发疯,不会发送任何东西。如果它确实发送媒体,您可以将rtp头分解并查看有效负载,以确保它是VP8i实际删除的goog remb,因为我试图逐行删除,以使某些内容正常工作。事实上,chrome正在发送数据,我的janus插件也正确转发,正如我通过wireshark看到的那样。关于“视频媒体线路中正确的rtp有效负载”,您的意思是我应该在firefox中设置m=video 1 rtp/SAVPF 120吗?分解rtp标题的确切含义是什么?你会怎么做?感谢您的时间线应该是m=video 1 RTP/SAVPF 100
,以仅指示一个映射(对于VP8)。那么只有VP8映射应该存在。您可以将缓冲区强制转换为rtp数据包,然后访问该类型<代码>rtp_头*包头=(rtp_头*)buf;包装头->类型//有效载荷m线现在已修复,我还复制了sdp
v=0
o=Mozilla-SIPUA-32.0.3 11426 0 IN IP4 127.0.0.1
s=SIP Call
t=0 0
a=group:BUNDLE audio video
a=msid-semantic: WMS janus
m=audio 1 RTP/SAVPF 109 0 8 101
a=mid:audio
c=IN IP4 192.168.0.1
a=sendrecv
a=rtcp-mux
a=ice-ufrag:BRBU
a=ice-pwd:2W4fGNr//HejhiC4UIabW6
a=ice-options:trickle
a=fingerprint:sha-256 C5:5F:DA:7D:84:47:B1:BF:6B:55:16:62:48:31:3E:D3:F1:7B:25:89:92:4A:4B:4D:4D:D9:D5:AF:EA:D8:15:44
a=setup:active
a=connection:new
a=rtpmap:109 opus/48000/2
a=ptime:20
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=ssrc:3725983979 cname:janusaudio
a=ssrc:3725983979 msid:janus janusa0
a=ssrc:3725983979 mslabel:janus
a=ssrc:3725983979 label:janusa0
a=candidate:1 1 udp 2013266431 192.168.0.1 56574 typ host
m=video 1 RTP/SAVPF 120
a=mid:video
c=IN IP4 192.168.0.1
a=sendrecv
a=rtcp-mux
a=ice-ufrag:jZ5b
a=ice-pwd:dQQej9UIpPl5zuXBQNg3Nz
a=ice-options:trickle
a=fingerprint:sha-256 C5:5F:DA:7D:84:47:B1:BF:6B:55:16:62:48:31:3E:D3:F1:7B:25:89:92:4A:4B:4D:4D:D9:D5:AF:EA:D8:15:44
a=setup:active
a=connection:new
a=rtpmap:120 VP8/90000
a=rtcp-fb:120 nack
a=rtcp-fb:120 nack pli
a=rtcp-fb:120 ccm fir
a=ssrc:1425382999 cname:janusvideo
a=ssrc:1425382999 msid:janus janusv0
a=ssrc:1425382999 mslabel:janus
a=ssrc:1425382999 label:janusv0
a=candidate:2 1 udp 2013266431 192.168.0.1 39063 typ host
m=application 0 DTLS/SCTP 0
c=IN IP4 192.168.0.1