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