Google chrome 处理chrome';s rtp流?

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

我正在使用webrtc将网络摄像头从浏览器流式传输到服务器,在服务器上可以执行以下设置:

  • 使用firefox和修改后的echo测试html,我将网络摄像头流发送到janus服务器
  • janus服务器正在使用一个修改过的echotest插件运行,该插件只是将janus_videorecv_incoming_rtp()中给定的char*buf通过udp流传输到端口5060,仅用于测试目的()
  • 下面的gstreamer命令行实际上打开了一个显示流式视频的窗口
  • 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上进行了测试)

    以下是我对你的插件更改的建议

  • 在从chrome请求关键帧之前,确保gstreamer管道设置为接收
  • webrtc媒体准备就绪时请求关键帧(有关详细信息,请参阅janus\u双向流媒体\u设置\u媒体功能)
  • 不要使用
    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