0

クライアントが WebRTC RTP ストリームを送信するパブリック IP があります。

クライアントは、コーデックと、ストリームを送信するポートを認識します。

私は可能な限り実装のベアボーンとしてやろうとしていますが、多くの詳細が欠けているようです.

すべての Google 検索ポイントは、Janus ゲートウェイなど、必要に応じて受け入れられる何らかのサーバーを使用することですが、ブラウザに RTP を送信させることが唯一の要件であるため、なぜこれが必要なのかわかりません。定義済みの IP とポートにストリーミングします。

Janus ゲートウェイを使用して作業セットアップを作成し、使用する SDP をコピーして、Janus なしのセットアップで使用できるようにしました。

    navigator.mediaDevices.getUserMedia({audio: true, video: true}).then(function (stream) {
        let videoElement = document.getElementById("my-video");
        videoElement.srcObject = stream;


        var peerConnection = new RTCPeerConnection({iceServers: []});

        peerConnection.onnegotiationneeded = function() {
            console.log("onnegotiationneeded");


            peerConnection.createOffer({offerToReceiveAudio: false, offerToReceiveVideo: false}).then(function (offer) {
                peerConnection.setLocalDescription(offer);

                console.log("setRemoteDescription");


                peerConnection.setRemoteDescription({
                    type: 'answer',
                    sdp: `v=0
o=mozilla...THIS_IS_SDPARTA-74.0.1 1586270943313087 1 IN IP4 192.168.1.5
s=VideoRoom 1234
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS janus
m=audio 9 UDP/TLS/RTP/SAVPF 109
c=IN IP4 192.168.1.5
a=recvonly
a=mid:0
a=rtcp-mux
a=ice-ufrag:uuIW
a=ice-pwd:bW5IdRMw2iMhH5wLiC+2u3
a=ice-options:trickle
a=fingerprint:sha-256 6E:5C:B0:6A:56:78:54:93:AB:6D:21:7E:B7:B3:F9:80:5C:0D:00:F0:D8:52:8E:BA:F1:87:C4:A7:37:38:CB:46
a=setup:active
a=rtpmap:109 opus/48000/2
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid
a=msid:janus janusa0
a=ssrc:849691919 cname:janus
a=ssrc:849691919 msid:janus janusa0
a=ssrc:849691919 mslabel:janus
a=ssrc:849691919 label:janusa0
a=candidate:1 1 udp 2013266431 192.168.1.5 60526 typ host
a=end-of-candidates
m=video 9 UDP/TLS/RTP/SAVPF 126
c=IN IP4 192.168.1.5
a=recvonly
a=mid:1
a=rtcp-mux
a=ice-ufrag:uuIW
a=ice-pwd:bW5IdRMw2iMhH5wLiC+2u3
a=ice-options:trickle
a=fingerprint:sha-256 6E:5C:B0:6A:56:78:54:93:AB:6D:21:7E:B7:B3:F9:80:5C:0D:00:F0:D8:52:8E:BA:F1:87:C4:A7:37:38:CB:46
a=setup:active
a=rtpmap:126 H264/90000
a=fmtp:126 profile-level-id=42e01f;packetization-mode=1
a=rtcp-fb:126 ccm fir
a=rtcp-fb:126 nack
a=rtcp-fb:126 nack pli
a=rtcp-fb:126 goog-remb
a=rtcp-fb:126 transport-cc
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:6/inactive http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=msid:janus janusv0
a=ssrc:3452602418 cname:janus
a=ssrc:3452602418 msid:janus janusv0
a=ssrc:3452602418 mslabel:janus
a=ssrc:3452602418 label:janusv0
a=candidate:1 1 udp 2013266431 192.168.1.5 60526 typ host
a=end-of-candidates`
                })
            });
        };

        let tracks = stream.getTracks();
        for(var i = 0; i < tracks.length; i++) {
            peerConnection.addTrack(tracks[i]);
        }

    });

ここでは、Web カメラ フィードを初期化し、ここに記載されているように ICE サーバーなしで RTCPeerConnection を作成し、すべてのトラックを追加します。

onnegotiationneeded コールバックにリスナーを設定します。ネゴシエーションが必要な場合は、RTCPeerConnection で offerToReceiveAudio と offerToReceiveVideo を false に設定してオファーを作成し、作成後に、作成したオファーを RTCPeerConnections ローカルの説明として設定します。

この後、定義済みの SDP を remoteDescription として設定しました。

SDP は Janus セッションからコピーされたもので、ice-ufrag、ice-pwd、ice-options などの ICE 属性が含まれています。それらを削除すると、無効な説明に関するエラーが発生します。

SDP には STUN(?) 候補も含まれており、それらを削除しても違いはありません。

これを実行した後、ブラウザーは STUN 候補に接続しますが、サーバーがパブリック IP で実行されているため、これは必要ないため、要求は失敗します。

ブラウザが事前定義されたコーデックの事前定義されたホスト/ポートに RTP を送信する最小限の設定を行うには、どの手順を実行する必要がありますか?

4

1 に答える 1