无服务器,点对点,通过声音共享本地文件

LiveVideoStack 2020年11月5日

Written By ZION3R

url : https://www.kitploit.com/2020/10/wave-share-serverless-peer-to-peer.html


首先,附近的设备通过一系列音频音频序列交换必要的会话描述协议(SDP)数据来协商WebRTC连接。在成功的协商之后,浏览器之间建立一个本地的WebRTC连接,并允许通过局域网交换数据。


具体细节如下(2分钟视频):https://youtu.be/d30QDrKyQkg


你也可以自己试试:https://ggerganov.github.io/wave-share


运作原理


WebRTC技术允许运行在不同设备上的两个浏览器相互连接并交换数据。不需要安装插件或下载应用程序。为了启动连接,对等方需要交换联系信息(ip地址、网络端口、会话id等)。这个过程被称为“信号传递/信令”。WebRTC规范没有定义任何信令标准-联系人交换可以通过任何协议或技术实现。


在这个项目中,信令是通过声音执行的。信号序列如下:


  • 对等端A通过将会话数据编码成音频音调来广播WebRTC连接。

  • 附近的对等点(复数)捕捉声音发出的源头对等点A并解码WebRTC会话数据

  • 尝试与A端建立连接的B端以音频应答响应。回复中包含对等方B的联系信息。另外,对等端B开始尝试连接到对等端A

  • 对等端A从B端接收应答,解码传输的联系数据,允许B端连接

  • 建立连接


无服务器,点对点,通过声音共享本地文件



所述信令序列不涉及信令服务器。因此,使用通过声音发出信号的应用程序可以由静态网页提供服务。唯一的要求是控制音频输出/捕获设备。


目前的方法有一个明显的局限性(特征),即只有附近的设备(例如在同一房间内)才能建立连接。此外,设备必须连接在同一个本地网络,因为NAT是不可用的。


声音发射/接收


通过声音通信的数据包含初始化WebRTC连接所需的联系信息。该数据以会话描述协议(SDP)格式存储。由于声音数据在带宽和健壮性/鲁棒性robustness方面有明显的限制,因此最好传输尽可能少的数据。因此,SDP从所有不相关的信息中剥离,只传输建立连接所需的必要数据。目前,包含所需的最小SDP数据的声音包的格式如下:

无服务器,点对点,通过声音共享本地文件


音频包的总大小为112字节。使用当前的音频编码算法,SDP包可以在5-10秒内传输(取决于使用的Tx协议)。使用较慢的协议在嘈杂的环境中或在通信设备彼此相距较远的情况下提供更可靠的传输。


Data-to-sound编码


目前的方法使用多频移频键控(FSK)调制方案。要传输的数据首先被分成4位块。在每一时刻,使用6个音调传输3个字节—每个4位块一个音调。6个音调在4.5kHz的范围内发射,分为96个等距频率:

无服务器,点对点,通过声音共享本地文件


For all protocols(对所有的协议): dF = 46.875 Hz. For non-ultrasonic protocols(对非超声波协议): F0 = 1875.000 Hz. For ultrasonic protocols:(对超声波协议) F0 = 15000.000 Hz.


获取本地IP地址


为了方便起见,一个简单的WebRTC hack被用来自动检测您机器的本地IP地址,所以您不必手动提供它。然而,由于安全原因,最新的WebRTC规范阻止了这一点的发生,因此在某个时候,这个“特性”将在所有浏览器中停止工作。例如,它不再适用于Safari。


构建


Web Assembly 模块
wave.wasm

您需要一个Emscripten编译器。另外,您需要使用Emscripten构建FFTW。运行compile.sh 脚本。


CLI工具 wave-share


这是一个简单的工具,使用 wave-share共享tx/rx协议接收和发送数据。在标准输入上键入一些文本,然后按Enter键发送。


# buildgit clone https://github.com/ggerganov/wave-sharecd wave-share && mkdir build && cd buildcmake ..make# running./wave-share


下面是一个演示如何使用CLI工具的短片:https://youtu.be/TcfjCMCyqF0


已知的问题/需要改进的东西


  • 不适用于:IE、IE Edge、iOS上的Chrome/Firefox、macOS上的Safari

  • 超声波传输在大多数设备上不起作用。可能与硬件限制有关

  • 存在多个本地网络时,当前无法选择使用哪一个。通常情况下默认使用第一个

  • 在传输过程中偶尔会有声音破裂。需要优化发送代码

  • emscripten generated.js的大小太大(~1MB)。需要用纯JS重写

  • 在移动设备上,使用Firefox,即使在关闭选项卡后,页面仍可以在后台运行


Download Wave-Share

Wave-Share体验

https://github.com/ggerganov/wave-share


还可输入800
全部评论
作者介绍

LiveVideoStack

音视频技术社区

文章

粉丝

视频

阅读排行
  • 2周
  • 4周
  • 16周
热门视频

WebRTC视频数据流程分析

许建林/《WebRTC Native开发实战》书籍作者