`
haoningabc
  • 浏览: 1477793 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

webrtc学习笔记一 (视频流)

阅读更多
google官方的
socket.io的源码
https://bitbucket.org/webrtc/codelab/downloads
http://dl.iteye.com/topics/download/88405497-3fd1-3e34-adba-004583638559

最简单的WebRTC示例
http://www.blogjava.net/linli/archive/2014/10/21/418910.html
webrtc.html
<html>
<body>
    Local: <br>
    <video id="localVideo" autoplay></video><br>
    Remote: <br>
    <video id="remoteVideo" autoplay></video>

    <script>
        // 仅仅用于控制哪一端的浏览器发起offer,#号后面有值的一方发起
        var isCaller = window.location.href.split('#')[1];

        // 与信令服务器的WebSocket连接
        var socket = new WebSocket("ws://192.168.137.27:3000");

        // stun和turn服务器
        var iceServer = {
            "iceServers": [{
                "url": "stun:stun.l.google.com:19302"
            }, {
                "url": "turn:numb.viagenie.ca",
                "username": "haoningabc@163.com",
                "credential": "12345"
            }]
        };

        // 创建PeerConnection实例 (参数为null则没有iceserver,即使没有stunserver和turnserver,仍可在局域网下通讯)
        var pc = new webkitRTCPeerConnection(iceServer);

        // 发送ICE候选到其他客户端
        pc.onicecandidate = function(event){
            if (event.candidate !== null) {
                socket.send(JSON.stringify({
                    "event": "_ice_candidate",
                    "data": {
                        "candidate": event.candidate
                    }
                }));
            }
        };

        // 如果检测到媒体流连接到本地,将其绑定到一个video标签上输出
        pc.onaddstream = function(event){
            //document.getElementById('remoteVideo').src = URL.createObjectURL(event.stream);
            document.getElementById('remoteVideo').srcObject = event.stream;
        };

        // 发送offer和answer的函数,发送本地session描述
        var sendOfferFn = function(desc){
            pc.setLocalDescription(desc);
            socket.send(JSON.stringify({ 
                "event": "_offer",
                "data": {
                    "sdp": desc
                }
            }));
        },
        sendAnswerFn = function(desc){
            pc.setLocalDescription(desc);
            socket.send(JSON.stringify({ 
                "event": "_answer",
                "data": {
                    "sdp": desc
                }
            }));
        };

        // 获取本地音频和视频流
        navigator.webkitGetUserMedia({
            "audio": true,
            "video": true
        }, function(stream){
            //绑定本地媒体流到video标签用于输出
            //document.getElementById('localVideo').src = URL.createObjectURL(stream);
            document.getElementById('localVideo').srcObject = stream;
            //向PeerConnection中加入需要发送的流
            pc.addStream(stream);
            //如果是发起方则发送一个offer信令
            if(isCaller){
                pc.createOffer(sendOfferFn, function (error) {
                    console.log('Failure callback: ' + error);
                });
            }
        }, function(error){
            //处理媒体流创建失败错误
            console.log('getUserMedia error: ' + error);
        });

        //处理到来的信令
        socket.onmessage = function(event){
            var json = JSON.parse(event.data);
            console.log('onmessage: ', json);
            //如果是一个ICE的候选,则将其加入到PeerConnection中,否则设定对方的session描述为传递过来的描述
            if( json.event === "_ice_candidate" ){
                pc.addIceCandidate(new RTCIceCandidate(json.data.candidate));
            } else {
                pc.setRemoteDescription(new RTCSessionDescription(json.data.sdp));
                // 如果是一个offer,那么需要回复一个answer
                if(json.event === "_offer") {
                    pc.createAnswer(sendAnswerFn, function (error) {
                        console.log('Failure callback: ' + error);
                    });
                }
            }
        };
    </script>
</body>
</html>


nodejs的server
server.js
//http://www.blogjava.net/linli/archive/2014/10/21/418910.html
var express = require('express'),
app = express(),
server = require('http').createServer(app);

server.listen(3000);

app.get('/', function(req, res) {
    res.sendfile(__dirname + '/webrtc.html');
});

var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({server: server});

// 存储socket的数组,这里只能有2个socket,每次测试需要重启,否则会出错
var wsc = [],
index = 1;

// 有socket连入
wss.on('connection', function(ws) {
    console.log('connection');

    // 将socket存入数组
    wsc.push(ws);

    // 记下对方socket在数组中的下标,因为这个测试程序只允许2个socket
    // 所以第一个连入的socket存入0,第二个连入的就是存入1
    // otherIndex就反着来,第一个socket的otherIndex下标为1,第二个socket的otherIndex下标为0
    var otherIndex = index--,
    desc = null;

    if (otherIndex == 1) {
        desc = 'first socket';
    } else {
        desc = 'second socket';
    }

    // 转发收到的消息
    ws.on('message', function(message) {
        var json = JSON.parse(message);
        console.log('received (' + desc + '): ', json);
        console.log('otherIndex ---(' + otherIndex + '): ');
        wsc[otherIndex].send(message, function (error) {
            if (error) {
                console.log('Send message error (' + desc + '): ', error);
            }
        });
    });
});

在局域网可以忽略google的stun
一台电脑先打开
192.168.137.27:3000
另一台打开
192.168.137.27:3000#true

iceServer设置成空也行


官方参考
http://www.html5rocks.com/en/tutorials/webrtc/basics/
http://www.html5rocks.com/en/tutorials/getusermedia/intro/


http://blog.csdn.net/liaowenfeng/article/details/18407837

例子
https://apprtc.appspot.com/

例子
http://www.simpl.info/rtcpeerconnection/
git:
https://github.com/andyet/SimpleWebRTC
https://github.com/webRTC-io/webRTC.io
分享到:
评论

相关推荐

    WebRTC学习笔记_Demo收集 .docx

    ### WebRTC学习笔记_Demo收集 #### 一、WebRTC现状与历史背景 WebRTC(Web Real-Time Communication)是一项开放的、免费的技术框架,旨在使Web浏览器能够在无需插件的情况下进行实时音视频通信。该技术最初由...

    WebRTC学习笔记01-最简单实现一对一视频通讯代码

    在"WebRTC学习笔记01-最简单实现一对一视频通讯代码"中,我们将探讨WebRTC的基础知识以及如何通过简单的代码实现一对一视频通话。 首先,WebRTC的核心组件包括: 1. **RTCPeerConnection**:这是WebRTC中最关键的...

    Webrtc学习笔记-V1

    7. **绘图显示**:处理视频的显示,包括在网页上呈现视频流。 8. **抖动处理**:通过Video Jitter Buffer减少视频抖动和丢包对画质的影响。 9. **音频相关**:如ANS+AEC,音频噪声抑制和回声消除,提供高质量的...

    音视频公开课WebRTC

    它负责处理音视频流的捕获、编码、传输和解码。 2. **会话建立协议(ICE, Interactive Connectivity Establishment)**:用于在复杂的网络环境中找到最优的数据传输路径。 3. **信令(Signaling)**:处理媒体会话的建立...

    graceup系列--WebRTC

    在"webRTC学习资料.doc"中,可能会涵盖WebRTC的架构、工作流程、API使用示例、信令流程详解等内容,帮助读者理解如何在实际项目中应用WebRTC。而"note.txt"可能是学习笔记,记录了学习过程中的重点、难点和实践经验...

    mediasoup学习整理

    此外,"mediasoup study"这个压缩包文件可能包含了一些学习笔记、示例代码或者实战教程,可以帮助你深入理解mediasoup的使用方法和功能。 总之,mediasoup是一个强大的工具,对于开发实时音视频应用的开发者来说,...

    SDP学习笔记

    **SDP学习笔记** SDP(Session Description Protocol)是一种用于描述多媒体会话的协议,它在互联网通信领域中起着至关重要的作用。本笔记将深入浅出地解析SDP的基本概念、结构以及应用,旨在提供比其他教程更为...

    JavaScript学习笔记.doc

    3. **Web即时通讯**:WebRTC等技术允许开发者使用JavaScript实现实时通信,如聊天应用和视频会议平台。 4. **股市网站**:JavaScript用于实时更新股票价格、绘制图表,提供用户实时交易体验。 5. **表单验证**:在...

    MyNote:日常学习笔记

    因此,这个压缩包可能包含一系列的文本文件(如Markdown格式的学习笔记)、代码示例、配置文件或其他与上述标签相关的资源。 综上所述,"MyNote"是一个综合性的个人学习资源库,涵盖了从基础编程语言(Python、Go、...

    大华摄像头前端demo

    【大华摄像头前端demo】是针对大华品牌的监控摄像头所设计的一个前端展示示例项目,主要目的是为了演示如何在Web端实现对大华摄像头的实时视频流预览、控制及其它相关功能。这个demo通常包括了必要的HTML、CSS以及...

    图灵商城 代码,笔记,资料

    这个压缩包可能包含与图灵商城相关的各种代码实现、学习笔记和相关资料,对于深入理解图灵商城的运作机制,以及音视频处理技术的学习都有很大的帮助。 在图灵商城中,音视频部分可能涉及到的技术包括但不限于: 1....

    看国产开源流媒体SRS如何支持视频监控GB28181协议1

    通过上述介绍,我们可以看出SRS是一个强大且灵活的流媒体服务器,不仅适用于传统的直播场景,还能够适应不断发展的视频监控领域。随着GB28181的支持,SRS进一步拓宽了其在安防领域的应用,为实现云监控提供了有力的...

    Backup 2023-10-26.zip

    在压缩包中,多个文件带有“.goodnotes”扩展名,意味着它们是GoodNotes应用中的笔记文件,可能包含个人的工作记录、学习笔记或项目资料。 2. **Support Sites**:文件名中出现“support.google.com”和“support....

    SDP.rar_ sdp_sdp

    SDP协议学习笔记.txt可能包含了以下关键知识点: 1. **SDP结构**:SDP由一系列的行(称为“描述行”)组成,每个描述行都以一个大写字母开头,如`v=`、`o=`、`s=`等,分别代表版本、会话发起者、会话名称等。这些行...

    live-camera

    "Live-Camera"是一个与实时摄像头流媒体技术相关的主题,主要涉及如何利用摄像头进行实时视频捕获、处理和传输。在IT行业中,实时摄像头技术广泛应用于视频会议、在线教育、安全监控、虚拟现实等多个领域。以下是...

    chatforaudio

    程序可能使用了如WebRTC这样的开源库来处理这些任务,它支持实时的音视频通信,并且兼容多种浏览器和平台。 3. **多用户同步**:为了实现多人聊天室功能,程序需要处理多个用户同时发送和接收音频流的同步问题。这...

    MyProctor-crx插件

    在技术层面,MyProctor-crx插件的开发可能涉及WebRTC(Web Real-Time Communication)技术,用于获取和传输摄像头视频流;利用Chrome API来监控浏览器行为;以及可能的机器学习算法,以更智能地分析和判断考生的行为...

Global site tag (gtag.js) - Google Analytics