本节内容

在本节课程中, 我们将学习以下内容:

  • 拍照并通过canvas元素获取图像数据。
  • 给对面发送图片。

本节的完整版代码位于 step-06 文件夹中。

工作原理

前面的小节中, 我们使用 RTCDataChannel 来传递文本消息。

本节课程, 将学习如何发送文件: 下面的示例发送的是通过 getUserMedia() 捕获的照片文件, 原理都是一样的。

核心内容包括:

  1. 建立数据通道。请注意, 本节不再将媒体流添加到对等连接中。
  2. 使用 getUserMedia() 获取摄像头拍到的视频。
var video = document.getElementById('video');function grabWebCamVideo() {console.log('Getting user media (video) ...');navigator.mediaDevices.getUserMedia({video: true}).then(gotStream).catch(function(e) {alert('getUserMedia() error: ' + e.name);});
}
  • 点击 Snap(拍照)按钮, 会从 video 流中得到一份快照(一帧视频), 并通过 canvas元素来展示:
var photo = document.getElementById('photo');
var photoContext = photo.getContext('2d');function snapPhoto() {photoContext.drawImage(video, 0, 0, photo.width, photo.height);show(photo, sendBtn);
}
  • 点击 Send(发送)按钮, 会将图像转换为字节数组(bytes), 并通过数据通道发送给对方:
function sendPhoto() {// 将数据分块的字节数长度;var CHUNK_LEN = 64000;var img = photoContext.getImageData(0, 0, photoContextW, photoContextH),len = img.data.byteLength,n = len / CHUNK_LEN | 0;console.log('Sending a total of ' + len + ' byte(s)');dataChannel.send(len);// split the photo and send in chunks of about 64KBfor (var i = 0; i < n; i++) {var start = i * CHUNK_LEN,end = (i + 1) * CHUNK_LEN;console.log(start + ' - ' + (end - 1));dataChannel.send(img.data.subarray(start, end));}// send the reminder, if anyif (len % CHUNK_LEN) {console.log('last ' + len % CHUNK_LEN + ' byte(s)');dataChannel.send(img.data.subarray(n * CHUNK_LEN));}
}
  • 接收端, 则将收到的字节, 转换为图像, 并展示给用户:
function receiveDataChromeFactory() {var buf, count;return function onmessage(event) {if (typeof event.data === 'string') {buf = window.buf = new Uint8ClampedArray(parseInt(event.data));count = 0;console.log('Expecting a total of ' + buf.byteLength + ' bytes');return;}var data = new Uint8ClampedArray(event.data);buf.set(data, count);count += data.byteLength;console.log('count: ' + count);if (count === buf.byteLength) {// we're done: all data chunks have been receivedconsole.log('Done. Rendering photo.');renderPhoto(buf);}};
}function renderPhoto(data) {var canvas = document.createElement('canvas');canvas.width = photoContextW;canvas.height = photoContextH;canvas.classList.add('incomingPhoto');// trail is the element holding the incoming imagestrail.insertBefore(canvas, trail.firstChild);var context = canvas.getContext('2d');var img = context.createImageData(photoContextW, photoContextH);img.data.set(data);context.putImageData(img, 0, 0);
}

实现代码

step-06 文件夹下的内容, 复制到 work 目录中。

index.html文件的内容为:

<!DOCTYPE html>
<html><head><title>Realtime communication with WebRTC</title><link rel="stylesheet" href="/css/main.css" />
</head><body><h1>Realtime communication with WebRTC</h1><h2><span>Room URL: </span><span id="url">...</span></h2><div id="videoCanvas"><video id="camera" autoplay></video><canvas id="photo"></canvas></div><div id="buttons"><button id="snap">Snap</button><span> then </span><button id="send">Send</button><span> or </span><button id="snapAndSend">Snap &amp; Send</button></div><div id="incoming"><h2>Incoming photos</h2><div id="trail"></div></div><script src="/socket.io/socket.io.js"></script><script src="https://webrtc.github.io/adapter/adapter-latest.js"></script><script src="js/main.js"></script></body>
</html>

如果没有执行上一节的操作, 需要在 step-06目录, 或者工作目录下, 安装相应的依赖, 命令如下:

cnpm install

安装完成后, 需要启动 Node.js 服务器, 在work目录下执行命令:

node index.js

请确认 index.js 文件的内容中包含了 Socket.IO 相关的内容, 参考前一小节。更多关于Node和Socket.IO的内容, 请参考 7_Set_up_signaling_service.md。

如果弹出对话框, 请点击Allow(允许)按钮, 授权使用本地摄像头。

本应用会创建一个随机的房间ID, 并将此ID加入URL中。

然后在一个新的标签或窗口打开同样的URL。

点击 SnapSend 按钮, 然后查看另一个标签页中, 是否显示了传过去的照片。

这个应用主要是实现了在不同标签页/不同窗口之间传输照片。

界面看起来类似这样:

练习与实践

  1. 修改代码, 以传输任意类型的文件。

了解更多

  • MediaStream 图像捕捉API,用于控制相机拍照的API, 让浏览器拍照变得简单易用: https://www.chromestatus.com/features/4843864737185792
  • MediaRecorder API, 用于录制音频和视频, 相关示例: https://webrtc.github.io/samples/src/content/getusermedia/record/; 相关文档: https://www.chromestatus.com/features/5929649028726784。

内容回顾

  • 拍照并通过canvas元素获取图像数据。
  • 给对面发送图片。

本节的完整版代码位于 step-06 文件夹中。

原文链接: https://codelabs.developers.google.com/codelabs/webrtc-web/#8

翻译人员: 铁锚 - https://blog.csdn.net/renfufei

翻译日期: 2018年08月27日

WebRTC基础实践 系列文章目录如下:

  • 1. WebRTC简介
  • 2. WebRTC课程概述
  • 3. 获取示例代码
  • 4. 获取摄像头的视频流
  • 5. 通过RTCPeerConnection传输流媒体视频
  • 6. 通过RTCDataChannel传输数据
  • 7. 配置信令服务
  • 8. 集成对等通信和信令服务
  • 9. 拍照并传给对方
  • 10. 总结

WebRTC基础实践 - 9. 拍照并传给对方相关推荐

  1. WebRTC基础实践 - 5.通过RTCPeerConnection传输流媒体视频

    本节内容 在本节课程中, 我们将学习以下内容: 使用WebRTC兼容库: adapter.js, 来抹平各浏览器间的差异. 通过 RTCPeerConnection API 传输流媒体视频. 控制 m ...

  2. WebRTC基础实践 - 10. 总结

    我们创建了一个视频聊天的APP, 同时支持传输文件以及其他数据! 内容回顾 在本教程中, 我们学习了以下内容: 获取webcam摄像头的视频内容. 通过 RTCPeerConnection 传输视频. ...

  3. WebRTC基础实践 - 7. 配置信令服务

    本节内容 在本节课程中, 我们将学习以下内容: 通过 npm 安装 package.json 文件中指定的项目依赖 运行Node.js服务器, 通过 node-static 提供静态文件服务. 用So ...

  4. WebRTC基础实践 - 1. WebRTC简介

    WebRTC 是一个开源的实时通信项目, 主要目标是对Web/原生App平台上的语音.视频.以及数据传输等实时通讯提供支持. WebRTC 主要包括以下 JavaScript API(点击链接可查看相 ...

  5. 前端webRTC实现一对一(也可以转化为一对多)视频聊天及视频流截图上传(拍照上传)——WebRTC实战

    一个使用webRTC进行一对一或一对多视频通话的demo并可以对播放视频流截图拍照上传 点击查看具体webRTC API 最终效果如图 一.这个demo满足了: 1.PC端获取远程APP操作人员的后置 ...

  6. html5拍照上传 java_如何使用HTML5实现拍照上传应用

    在HTML5规范的支持下,WebApp在手机上拍照已经成为可能.在下面,我将讲解Web App如何用手机进行拍照,显示在页面上并上传到服务器. 1.  视频流 HTML5 The Media Capt ...

  7. 零基础实践深度学习之Python基础

    零基础实践深度学习之Python基础 Python数据结构 数字 字符串 列表 元组 字典 Python面向对象 Python JSON Python异常处理 Python文件操作 常见Linux命令 ...

  8. 5月19-20日WebRTCon 2018 梳理全球WebRTC技术实践与案例

    4月17日,距离WebRTCon 2018举行还有一个多月的时间,这是由音视频技术社区LiveVideoStack发起的WebRTC生态大会.大会将聚焦WebRTC技术实践与应用案例两大主线,旨在为W ...

  9. 20155202《网络对抗》Exp9 web安全基础实践

    20155202<网络对抗>Exp9 web安全基础实践 实验前回答问题 (1)SQL注入攻击原理,如何防御 SQL注入产生的原因,和栈溢出.XSS等很多其他的攻击方法类似,就是未经检查或 ...

最新文章

  1. 07 分支管理 —— Feature分支
  2. TypeError: __init__() takes 1 positional argument but 4 were given
  3. fuse java_java中的Fuse文件系统 - JVM错误双重免费或损坏
  4. 【网址收藏】Linux 命令分类(debian Linux)
  5. python编程内置函数使用方法_python编程(4)--内置函数
  6. 【2016年第5期】位置大数据在车辆保险风险管理中的应用
  7. 玩转Spring——Spring IOC/DI
  8. (34)System Verilog类的多对象详解
  9. 《Arduino开发实战指南:机器人卷》一2.4 时间函数
  10. html基礎之渐变属性(斑马线)
  11. ab压力 failed_Apache ab压力测试时出现大量的错误原因分析
  12. 深海迷航坐标传送代码_深海迷航全控制台代码汇总 深海迷航物品作弊码大全...
  13. 同源、跨域、跨站、SameSite与withCredentials
  14. React基础(肆)———状态和循环渲染
  15. 译文 :图文教程,8步教你变身数据科学家
  16. [ACNOI2021]爱乐之城
  17. 第三方登录之微信登录
  18. H5项目2-3手机邮箱导航
  19. 看看什么叫老牛吃嫩草
  20. 影院活动管理系统--项目设计阶段.

热门文章

  1. Computer-Aided Civil and Infrastructure Engineering投稿经验
  2. 需求分析-原文分析法
  3. 基于javaweb+mysql的简单留言板
  4. Install/uninstall .deb files
  5. 非法传播影视剧会被封号,剪辑片段算侵权吗?
  6. 机器学习——时间序列分析
  7. 空开与漏电保护器的区别
  8. html页面禁止返回代码,多页面网站禁用浏览器后退键
  9. CSS字体属性与文本属性详解
  10. CSU 1559 外卖的撕‘哔’大战