【问题标题】:Basic webrtc example基本的 webrtc 示例
【发布时间】:2013-09-18 14:54:22
【问题描述】:

我只想在两个视频元素中显示相同的视频,以简单了解 webrtc 的工作原理。我是这样写的:

    <video id="video1" autoplay></video>
    <video id="video2" autoplay></video>

    <script type="text/javascript">
        var video1 = document.getElementById('video1');
        var video2 = document.getElementById('video2');
        var pc;

        navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
        navigator.getUserMedia({ audio: true, video: true }, function(stream){
            pc = new webkitRTCPeerConnection(null);

            pc.addStream(stream);

            pc.onaddstream = function(e){
                alert('onaddstream');
                video2.src = URL.createObjectURL(e.stream);
            };

            pc.onicecandidate = function(e){
                alert('onicecandidate');
                if (!e || !e.candidate) return;
                pc.addIceCandidate(e.candidate);
            };

            video1.src = URL.createObjectURL(stream);

            pc.createOffer(function(description){
                pc.setRemoteDescription(description);
                pc.setLocalDescription(description);
            });
        });
    </script>

但它不起作用。你能帮忙吗?

【问题讨论】:

  • 你需要一个'caller'和'callee' RTCPeerConnection:你只有一个。试试@Muaz Khan 的例子或simpl.info/rtcpeerconnection 的例子。

标签: javascript html webrtc


【解决方案1】:

试试下面的演示:

<video id="peer2-to-peer1" autoplay controls style="width:40%;"></video>
<video id="peer1-to-peer2" autoplay controls style="width:40%;"></video>

<script>
 var mediaConstraints = {
     optional: [],
     mandatory: {
         OfferToReceiveAudio: true,
         OfferToReceiveVideo: true
     }
 };

 var offerer, answerer;
 var offererToAnswerer = document.getElementById('peer1-to-peer2');
 var answererToOfferer = document.getElementById('peer2-to-peer1');

 window.RTCPeerConnection = window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
 window.RTCSessionDescription = window.mozRTCSessionDescription || window.RTCSessionDescription;
 window.RTCIceCandidate = window.mozRTCIceCandidate || window.RTCIceCandidate;

navigator.getUserMedia = navigator.mozGetUserMedia || navigator.webkitGetUserMedia;
 window.URL = window.webkitURL || window.URL;

 window.iceServers = {
     iceServers: [{
         url: 'stun:23.21.150.121'
     }]
 };

 /* offerer */

 function offererPeer(stream) {
     offerer = new RTCPeerConnection(window.iceServers);
     offerer.addStream(stream);

     offerer.onaddstream = function (event) {
         offererToAnswerer.src = URL.createObjectURL(event.stream);
         offererToAnswerer.play();
     };

     offerer.onicecandidate = function (event) {
         if (!event || !event.candidate) return;
         answerer.addIceCandidate(event.candidate);
     };

     offerer.createOffer(function (offer) {
         offerer.setLocalDescription(offer);
         answererPeer(offer, stream);
     }, onSdpError, mediaConstraints);
 }


 /* answerer */

 function answererPeer(offer, stream) {
     answerer = new RTCPeerConnection(window.iceServers);
     answerer.addStream(stream);

     answerer.onaddstream = function (event) {
         answererToOfferer.src = URL.createObjectURL(event.stream);
         answererToOfferer.play();
     };

     answerer.onicecandidate = function (event) {
         if (!event || !event.candidate) return;
         offerer.addIceCandidate(event.candidate);
     };

     answerer.setRemoteDescription(offer, onSdpSucces, onSdpError);
     answerer.createAnswer(function (answer) {
         answerer.setLocalDescription(answer);
         offerer.setRemoteDescription(answer, onSdpSucces, onSdpError);
     }, onSdpError, mediaConstraints);
 }



 function getUserMedia(callback) {
     navigator.getUserMedia({
         audio: true,
         video: true
     }, callback, onerror);

     function onerror(e) {
         console.error(e);
     }
 }

 getUserMedia(function (stream) {
     offererPeer(stream);
 });

 function onSdpError(e) {
     console.error('onSdpError', e);
 }

 function onSdpSucces() {
     console.log('onSdpSucces');
 }
</script>

取自here

【讨论】:

  • 代码有效。但是将其转换为 2 个 html 页面 - 一个仅用于视频捕获,另一个仅用于视频显示,这太可怕了!你知道在哪里可以找到纯客户端/服务器,而不是 p2p WebRTC JavaScript 示例。或者如何转换代码 - 它没有依赖关系,但让我发疯。
  • 当我运行此代码时,它会在两个视频元素上显示我的视频。我尝试与网络中的另一台机器一起使用。当两台机器加载相同的页面时,两个视频元素再次只显示本地视频
  • @IsuruHerath WebRTC 使用遵循提供/应答模型的 SDP 协议。此模型需要第一个对等方创建报价,并且需要与第二个对等方共享。我们用来与其他用户分享一个用户的报价的过程被称为“信号”。信号可以复制/粘贴您的代码,例如(github.com/cjb/serverless-webrtc) 或通过 websocket、XHR [POST/GET]、SIP、XMPP 等。“答案”中的演示仅针对单页。这里不使用信号介质。这就是其他对等方无法连接的原因。
  • 我在互联网上找到了另一个答案。但它需要在两台机器上运行单独的 wamp 服务器,并且每台机器都应该登录到其本地服务器上的网页。我还必须在运行 websocket-server 的远程机器上设置 IP 地址。但我需要在两台机器上登录相同的网页并在不设置 IP 地址的情况下进行连接。有没有办法做到这一点?
  • 请检查这个:muaz-khan.blogspot.com/2013/12/i-want-to-learn-webrtc.html 看看需要什么样的东西才能连接位于不同网络后面的两个对等点(例如信令服务器 + ICE 服务器)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
相关资源
最近更新 更多