Wave-Share -无服务器,点对点,通过声音共享本地文件
正文字數:1807 ?閱讀時長:3分鐘
這是一個有關于使用聲音的WebRTC信號的概念驗證。適用于所有有麥克風+揚聲器的設備。在瀏覽器中運行。
Written By?ZION3R
url :?https://www.kitploit.com/2020/10/wave-share-serverless-peer-to-peer.html
首先,附近的設備通過一系列音頻音頻序列交換必要的會話描述協議(SDP)數據來協商WebRTC連接。在成功的協商之后,瀏覽器之間建立一個本地的WebRTC連接,并允許通過局域網交換數據。
具體細節(jié)如下(2分鐘視頻):https://youtu.be/d30QDrKyQkg
你也可以自己試試:https://ggerganov.github.io/wave-share
運作原理
WebRTC技術允許運行在不同設備上的兩個瀏覽器相互連接并交換數據。不需要安裝插件或下載應用程序。為了啟動連接,對等方需要交換聯系信息(ip地址、網絡端口、會話id等)。這個過程被稱為“信號傳遞/信令”。WebRTC規(guī)范沒有定義任何信令標準-聯系人交換可以通過任何協議或技術實現。
在這個項目中,信令是通過聲音執(zhí)行的。信號序列如下:
對等端A通過將會話數據編碼成音頻音調來廣播WebRTC連接。
附近的對等點(復數)捕捉聲音發(fā)出的源頭對等點A并解碼WebRTC會話數據
嘗試與A端建立連接的B端以音頻應答響應。回復中包含對等方B的聯系信息。另外,對等端B開始嘗試連接到對等端A
對等端A從B端接收應答,解碼傳輸的聯系數據,允許B端連接
建立連接
?
所述信令序列不涉及信令服務器。因此,使用通過聲音發(fā)出信號的應用程序可以由靜態(tài)網頁提供服務。唯一的要求是控制音頻輸出/捕獲設備。
目前的方法有一個明顯的局限性(特征),即只有附近的設備(例如在同一房間內)才能建立連接。此外,設備必須連接在同一個本地網絡,因為NAT是不可用的。
聲音發(fā)射/接收
通過聲音通信的數據包含初始化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字節(jié)。使用當前的音頻編碼算法,SDP包可以在5-10秒內傳輸(取決于使用的Tx協議)。使用較慢的協議在嘈雜的環(huán)境中或在通信設備彼此相距較遠的情況下提供更可靠的傳輸。
Data-to-sound編碼
目前的方法使用多頻移頻鍵控(FSK)調制方案。要傳輸的數據首先被分成4位塊。在每一時刻,使用6個音調傳輸3個字節(jié)—每個4位塊一個音調。6個音調在4.5kHz的范圍內發(fā)射,分為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規(guī)范阻止了這一點的發(fā)生,因此在某個時候,這個“特性”將在所有瀏覽器中停止工作。例如,它不再適用于Safari。
構建
Web Assembly 模塊wave.wasm
您需要一個Emscripten編譯器。另外,您需要使用Emscripten構建FFTW。運行compile.sh?腳本。
CLI工具?wave-share
這是一個簡單的工具,使用?wave-share共享tx/rx協議接收和發(fā)送數據。在標準輸入上鍵入一些文本,然后按Enter鍵發(fā)送。
# buildgit 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
超聲波傳輸在大多數設備上不起作用。可能與硬件限制有關
存在多個本地網絡時,當前無法選擇使用哪一個。通常情況下默認使用第一個
在傳輸過程中偶爾會有聲音破裂。需要優(yōu)化發(fā)送代碼
emscripten generated.js的大小太大(~1MB)。需要用純JS重寫
在移動設備上,使用Firefox,即使在關閉選項卡后,頁面仍可以在后臺運行
Download Wave-Share
Wave-Share體驗
https://github.com/ggerganov/wave-share
灣區(qū)最原汁原味的技術,全球最前沿的應用實踐
無需漂洋過海,我們在線上等您!
LiveVideoStackCon 2020?美國站
2020年12月10日-12月11日
點擊【閱讀原文】了解更多詳細信息
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的Wave-Share -无服务器,点对点,通过声音共享本地文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebRTC安全体系架构的8个组件
- 下一篇: 感谢有你 | LiveVideoStac