- 浏览: 1483284 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
目标:
两个浏览器的jslinux可以进行数据交互
fabrice的jslinux是跑在浏览器中的linux,
提供了通过
/dev/clipboard 与<textare>交互的功能,交互的方法是clipboard_set
可以在jslinux.js中的clipboard_set方法中加入
datachannel的send方法,使两个浏览器中的textare有数据同步
从而是jslinux中通过一个linux的clipboard与另一个jslinux的clipboard交互
jslinux.js中修改的代码:
jslinux的html修改的代码:
在建立datachannel的时候使用的websocket 的node的代码:
测试,只有chrome可用
1.先在服务器上启动
node server.js
代码不完善,只能两台机器测试
2.一台电脑的chrome
http://192.168.137.27:8081/jslinux/webrtc2.html
另一台
http://192.168.137.27:8081/jslinux/webrtc2.html#true
看console的datachannel建立后
3.start启动vm
4.在一台vm中
tail -f /dev/clipboard
另一台中
echo "hahahahaha" > /dev/clipboard
看第一台机器中的clipboard是否接受到值
jslinux.zip 随便解压到tomcat或者nginx中即可使用,server.js是建立datachannle的时候时候用的websocke
两个浏览器的jslinux可以进行数据交互
fabrice的jslinux是跑在浏览器中的linux,
提供了通过
/dev/clipboard 与<textare>交互的功能,交互的方法是clipboard_set
可以在jslinux.js中的clipboard_set方法中加入
datachannel的send方法,使两个浏览器中的textare有数据同步
从而是jslinux中通过一个linux的clipboard与另一个jslinux的clipboard交互
jslinux.js中修改的代码:
/* Linux launcher Copyright (c) 2011-2012 Fabrice Bellard Redistribution or commercial use is prohibited without the author's permission. */ "use strict"; var term, pc, boot_start_time, init_state; function term_start() { term = new Term(80, 130, term_handler); term.open(); } /* send chars to the serial port */ function term_handler(str) { pc.serial.send_chars(str); } console.log("hao:version 1.2") function clipboard_set(val) { console.log("hao:clipboard_set---sendData->"); var el; el = document.getElementById("text_clipboard"); el.value = val; sendData(); } function clipboard_get() { console.log("hao:clipboard_get---->"); var el; el = document.getElementById("text_clipboard"); return el.value; } function clear_clipboard() { var el; el = document.getElementById("text_clipboard"); el.value = ""; } /* just used to display the boot time in the VM */ function get_boot_time() { return (+new Date()) - boot_start_time; } function start() { var params; init_state = new Object(); params = new Object(); /* serial output chars */ params.serial_write = term.write.bind(term); /* memory size (in bytes) */ params.mem_size = 16 * 1024 * 1024; /* clipboard I/O */ params.clipboard_get = clipboard_get; params.clipboard_set = clipboard_set; params.get_boot_time = get_boot_time; /* IDE drive. The raw disk image is split into files of * 'block_size' KB. */ params.hda = { url: "bin/hda%d.bin", block_size: 64, nb_blocks: 912 }; pc = new PCEmulator(params); init_state.params = params; //pc.load_binary("vmlinux-2.6.20.bin", 0x00100000, start2); //pc.load_binary("vmlinux26.bin", 0x00100000, start2); // pc.load_binary("vmlinuxtest.bin", 0x00100000, start2); //pc.load_binary("vmlinuxnono.bin", 0x00100000, start2); //pc.load_binary("vmlinux319.bin", 0x00100000, start2); pc.load_binary("vmlinux319clip.bin", 0x00100000, start2); } function start2(ret) { if (ret < 0) return; init_state.start_addr = 0x10000; //pc.load_binary("linuxstartnew.bin", init_state.start_addr, start3); pc.load_binary("linuxstart.bin", init_state.start_addr, start3); } function start3(ret) { var block_list; if (ret < 0) return; /* Preload blocks so that the boot time does not depend on the * time to load the required disk data (optional) */ block_list = [ 0, 7, 3, 643, 720, 256, 336, 644, 781, 387, 464, 475, 131, 589, 468, 472, 474, 776, 777, 778, 779, 465, 466, 473, 467, 469, 470, 512, 592, 471, 691, 697, 708, 792, 775, 769 ]; pc.ide0.drives[0].bs.preload(block_list, start4); } function start4(ret) { var cmdline_addr; if (ret < 0) return; /* set the Linux kernel command line */ cmdline_addr = 0xf800; pc.cpu.write_string(cmdline_addr, "console=ttyS0 root=/dev/hda ro init=/sbin/init notsc=1 hdb=none"); pc.cpu.eip = init_state.start_addr; pc.cpu.regs[0] = init_state.params.mem_size; /* eax */ pc.cpu.regs[3] = 0; /* ebx = initrd_size (no longer used) */ pc.cpu.regs[1] = cmdline_addr; /* ecx */ boot_start_time = (+new Date()); pc.start(); } term_start();
jslinux的html修改的代码:
<!DOCTYPE html> <html> <head> <title>Javascript PC Emulator</title> <style> .term { font-family: courier,fixed,swiss,monospace,sans-serif; font-size: 14px; color: #f0f0f0; background: #000000; } .termReverse { color: #000000; background: #00ff00; } #note { font-size: 12px; } #copyright { font-size: 10px; } #clipboard { font-size: 12px; } </style> </head> <body > <table border="0"> <tr valign="top"><td> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="utils.js"></script> <script type="text/javascript" src="term.js"></script> <script type="text/javascript" src="cpux86.js"></script> <script type="text/javascript" src="jslinux.js"></script> <div id="copyright">© 2011 Fabrice Bellard - <a href="news.html">News</a> - <a href="faq.html">FAQ</a> - <a href="tech.html">Technical notes</a></div> <input type="button" value="Clear clipboard" onclick="clear_clipboard();"><br><textarea row="4" cols="16" id="text_clipboard" ></textarea></br> <input type="button" value="addletter" onclick="addletter();"> <input type="button" value="start" onclick="start();"> </table> <script type="text/javascript" > function addletter(){ document.getElementById("text_clipboard").value=document.getElementById("text_clipboard").value+"a"; } $('#text_clipboard').bind('input propertychange', function() { //$('#result').html($(this).val().length + ' characters'); sendData(); }); var iceServer = null; var pc = new window.webkitRTCPeerConnection(iceServer,{optional: [{RtpDataChannels: true}]}); var isCaller = window.location.href.split('#')[1]; var socket = new WebSocket("ws://192.168.137.27:3000"); 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)); console.log("---------------->pc.setRemote"); // 如果是一个offer,那么需要回复一个answer if(json.event === "_offer") { console.log("------->createAnswer"); pc.createAnswer(function(desc){ pc.setLocalDescription(desc); console.log("---------------->pc.setLocal"); socket.send(JSON.stringify({ "event": "_answer", "data": { "sdp": desc } })); }, function (error) { console.log('Failure callback: ' + error); }); }else{ console.log("------->receive Answer---('"+json.event+"')"); } } }; try { sendChannel = pc.createDataChannel('sendDataChannel',{reliable: true}); } catch (e) { alert('createDataChannel() failed with exception: ' + e.message); } sendChannel.onopen = console.log('--Send channel open state is : ' +sendChannel.readyState); sendChannel.onclose = console.log('--Send channel close state is: ' +sendChannel.readyState); // 发送ICE候选到其他客户端 pc.onicecandidate = function(event){ console.log("onicecandidate----------->"); if (event.candidate !== null) { console.log("event.candidate != null"); socket.send(JSON.stringify({ "event": "_ice_candidate", "data": { "candidate": event.candidate } })); }else{ console.log("event.candidate == null"); } }; sendChannel.onmessage = function(event) { console.log("-sendChannel.onmessage--★★★★★"); document.getElementById('text_clipboard').value = event.data; }; function sendData() { var data = document.getElementById('text_clipboard').value; console.log("---->>>>sendData():"+data); sendChannel.send(data); } if(isCaller){ console.log("------->createOffer"); pc.createOffer(function(desc){ // console.log(desc); pc.setLocalDescription(desc); console.log("---------------->pc.setLocal"); socket.send(JSON.stringify({ "event": "_offer", "data": { "sdp": desc } })); }, function (error) { console.log('Failure callback: ' + error); }); } console.log("---over"); </script> <!--button id="sendButton" onclick="sendData()">Send</button> <textarea id="dataChannelSend" >abc</textarea> <div id="result"></div--> </body> </html>
在建立datachannel的时候使用的websocket 的node的代码:
//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}); function writeObj(obj){ var description = ""; for(var i in obj){ var property=obj[i]; description+=i+" = "+property+"\n"; } console.log(description); } // 存储socket的数组,这里只能有2个socket,每次测试需要重启,否则会出错 var wsc = [], index = 1; // 有socket连入 wss.on('connection', function(ws) { console.log('connection:'); //writeObj(ws); // 将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 ---('+desc+')(' + otherIndex + '): '+json.event); wsc[otherIndex].send(message, function (error) { if (error) { console.log('Send message error (' + desc + '): ', error); } }); }); });
测试,只有chrome可用
1.先在服务器上启动
node server.js
代码不完善,只能两台机器测试
2.一台电脑的chrome
http://192.168.137.27:8081/jslinux/webrtc2.html
另一台
http://192.168.137.27:8081/jslinux/webrtc2.html#true
看console的datachannel建立后
3.start启动vm
4.在一台vm中
tail -f /dev/clipboard
另一台中
echo "hahahahaha" > /dev/clipboard
看第一台机器中的clipboard是否接受到值
jslinux.zip 随便解压到tomcat或者nginx中即可使用,server.js是建立datachannle的时候时候用的websocke
发表评论
-
srt学习笔记一:srt的helloworld
2020-03-27 19:13 8471。无服务的方式:udp, 2。srs作为服务端:rtmp推收 ... -
xl2tp 备份
2019-09-24 16:25 7372019年9月24日更新: 注意,需要开启firewall ... -
sdl笔记
2019-01-31 17:19 744sdl教程教程 https://github.com/Twin ... -
tinyemu
2019-01-24 17:59 1441参考https://bellard.org/jslinux/t ... -
aws搭建xl2tp给iphone使用
2018-12-26 21:37 19022019年12月26日 可以参考原来的配置 https:// ... -
ios的safari使用自制ca证书测试webrtc
2018-08-20 13:31 2476这个需要注意 https://stackoverflow.c ... -
consul的基本使用
2017-06-27 11:13 1409### 安装 [centos7上consul的安装](ht ... -
lvs的helloworld
2017-06-13 20:36 602###################lvs######### ... -
系统调用的helloworld
2017-05-04 16:14 661《2.6内核标准教程》 p293 #include < ... -
bitcoin和cgminer的安装
2017-04-05 22:45 1966参考 http://blog.csdn.net/rion_ch ... -
ceph安装和常用命令
2017-03-21 21:55 966/etc/hosts ssh-keygen ssh-copy- ... -
mobile terminal 笔记
2016-12-02 15:35 651找出旧的iphone4 越狱之后可以变个小操作系统 mobi ... -
socket基础和select(python)
2016-06-14 17:21 1809上接 c语言的socket基础ht ... -
socket基础(c语言)
2016-06-14 16:45 1008不使用select 普通的基础socket连接,对多个客户端的 ... -
ffmpeg+nginx 的直播(2,直播摄像头和麦克风)
2016-05-28 20:21 4387假设我的服务器是centos7 192.168.139.117 ... -
ffmpeg+nginx 的直播(1,直播播放的视频文件)
2016-05-26 17:11 662064位操作系统centos7 ############ 1.一 ... -
socat和netcat(nc)
2016-04-29 22:36 1758转 原文链接: http://www.wenquan.name ... -
neutron基础九(qemu nat网络)
2016-02-06 17:21 1632接上基础八,kvm透传nested忽略 1.在主机ce ... -
neutron基础八(qemu 桥接网络)
2016-02-06 13:13 1550qemu的桥接和nat的qemu启动命令是一样的,但是后续的脚 ... -
neutron基础七(qemu tap)
2016-02-02 17:02 1034使用qemu 建立个虚拟机 然后用tap设备, 根据基础六,t ...
相关推荐
这个"webrtc demo(html+js+nodejs)"是一个基于WebRTC技术的多人视频会议示例,它将HTML、JavaScript和Node.js技术结合在一起,构建了一个基本的通信框架。 **HTML部分**:HTML是用户界面的基础,负责展示视频流和...
### WebRTC学习笔记_Demo收集 #### 一、WebRTC现状与历史背景 WebRTC(Web Real-Time Communication)是一项开放的、免费的技术框架,旨在使Web浏览器能够在无需插件的情况下进行实时音视频通信。该技术最初由...
在实际应用中,如视频采集,开发者首先需要创建`webrtc::VideoEngine`对象,然后通过`webrtc::ViECapture::GetInterface`获取`ViECapture`对象,再调用相应的接口进行设备管理和视频采集。例如,`...
这篇“webrtc学习笔记一”主要关注的是视频流处理,是WebRTC技术中的核心部分。在深入讨论之前,先了解一下WebRTC的基本架构和组成部分。 1. **基础概念**: - **Peer Connection**: 是WebRTC的核心组件,负责...
在本案例中,我们讨论的是WebRTC的M99版本,针对Linux ARM64架构的静态库。 静态库是一种将所有依赖项合并到一个可执行文件中的库类型,这意味着在运行时不需要外部的动态链接库,简化了部署过程。然而,由于静态库...
webrtc /adapter-latest.js
在"WebRTC学习笔记01-最简单实现一对一视频通讯代码"中,我们将探讨WebRTC的基础知识以及如何通过简单的代码实现一对一视频通话。 首先,WebRTC的核心组件包括: 1. **RTCPeerConnection**:这是WebRTC中最关键的...
WebRTC C ++示例在C ++上使用WebRTC(DataChannel)的示例程序(README.en.md是此文件的英文翻译。) 使用C ++中的WebRTC DataChannel的示例代码。要求Mac OS X 的Ubuntu编译$ cd $ git clone --depth 1 ...
WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API。它于2011年6月1日开源并在Google、Mozilla、Opera支持下被纳入万维网联盟的W3C...
webrtc中base库在linux平台编译,采用cmake编译,可以学习cmake的基本语法
5分钟搭建一个HTML5视频聊天Demo(WebRTC+NodeJS),资源包包括WebRTC和NodeJS下载,详细操作请参见http://blog.csdn.net/lixq_csdn/article/details/37815103
在本文中,我们将深入探讨如何使用JavaScript、socket.io、WebRTC、Node.js和Express搭建一个简易版的远程视频聊天应用。这些技术都是现代Web开发中的关键组件,它们各自扮演着不同的角色,共同构建出实时、低延迟的...
这个项目不仅展示了WebRTC与Vue.js的整合,还涵盖了信令服务、多设备兼容性以及移动端调试等多个重要知识点,对于想要学习WebRTC或者构建实时通信应用的开发者来说,是一个非常有价值的实践案例。
本项目是利用Node.js搭建的WebRTC视频聊天室,用户可以在网页上实现面对面的交流。服务的运行指南可参考README.md文件。 【知识点详解】: 1. WebRTC基础: - WebRTC是一种开源项目,由Google发起,旨在提供...
自己编写的WebRTC的JS例子。google的PC1,把本端和远端都合在一起了,初学者容易混淆。写了个小例子,分为本端和远端。可以通过手工拷贝SDP和ICE信息,进行呼叫接续。感觉流程比较清晰,可供初学者使用。 测试时,...
这个Demo为学习WebRTC和Node.js实时通信提供了一个基础平台,开发者可以在此基础上扩展功能,例如增加文本聊天、多人视频聊天或添加安全性措施。了解并掌握这些技术对于构建现代互联网应用至关重要,因为实时通信...
webrtc-streamer在国内编译相当困难,这里是本人花了一周时间编译完成的webrtc-streamer最新版本,可在ubuntu18.04及以上版本中使用,如果提示libstdc++版本过低,请升级系统的libstdc++。
WebRTC自带的peerconenction Windows版本 WebRTC自带的example里面的peerconenction_client和peerconenction_server,部分代码做了修改,可用于测试及印证源代码。
在本项目“WebRTC学习之三:录音和播放”中,我们将探讨如何利用C++来实现WebRTC的功能,特别是录音和播放操作,并结合Qt库创建用户界面。 1. WebRTC基础: WebRTC提供了包括音频、视频和数据共享在内的实时通信...
标题 "Node.js-一个WebRTC屏幕录像机electron应用" 提示我们这个项目是基于Node.js构建的,专门用于实现WebRTC技术的屏幕录制功能。它使用了Electron框架,这是一款允许开发者用JavaScript、HTML和CSS创建跨平台桌面...