前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Wave-Share -无服务器,点对点,通过声音共享本地文件

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

作者头像
LiveVideoStack
发布2020-11-11 14:28:59
1.7K0
发布2020-11-11 14:28:59
举报
文章被收录于专栏:音视频技术音视频技术

正文字数:1807 阅读时长:3分钟

这是一个有关于使用声音的WebRTC信号的概念验证。适用于所有有麦克风+扬声器的设备。在浏览器中运行。

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数据的声音包的格式如下:

Size, [B]

Description

1

Type of the SDP - Offer or Answer

1

Packet size in bytes (not including ECC bytes)

4

IP address of the transmitting peer

2

Network port that will be used for the communication

32

SHA-256 fingerprint of the session data

40

ICE Credentials - 16 bytes username + 24 bytes password

32

ECC correction bytes used to correct errors during Tx

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

Data-to-sound编码

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

Freq, [Hz]

Value, [bits]

Freq, [Hz]

Value, [bits]

...

Freq, [Hz]

Value, [bits]

F0 + 00*dF

Chunk 0: 0000

F0 + 16*dF

Chunk 1: 0000

...

F0 + 80*dF

Chunk 5: 0000

F0 + 01*dF

Chunk 0: 0001

F0 + 17*dF

Chunk 1: 0001

...

F0 + 81*dF

Chunk 5: 0001

F0 + 02*dF

Chunk 0: 0010

F0 + 18*dF

Chunk 1: 0010

...

F0 + 82*dF

Chunk 5: 0010

...

...

...

...

...

...

...

F0 + 14*dF

Chunk 0: 1110

F0 + 30*dF

Chunk 1: 1110

...

F0 + 94*dF

Chunk 5: 1110

F0 + 15*dF

Chunk 0: 1111

F0 + 31*dF

Chunk 1: 1111

...

F0 + 95*dF

Chunk 5: 1111

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键发送。

代码语言:javascript
复制
git clone https://github.com/ggerganov/wave-share
cd wave-share && mkdir build && cd build
cmake ..
make

# running
./wave-share

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

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

  • 不适用于:IE、IE Edge、iOS上的Chrome/Firefox、macOS上的Safari
  • 超声波传输在大多数设备上不起作用。可能与硬件限制有关
  • 存在多个本地网络时,当前无法选择使用哪一个。通常情况下默认使用第一个
  • 在传输过程中偶尔会有声音破裂。需要优化发送代码
  • emscripten generated.js的大小太大(~1MB)。需要用纯JS重写
  • 在移动设备上,使用Firefox,即使在关闭选项卡后,页面仍可以在后台运行
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LiveVideoStack 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档