最近想了解一些在瀏覽器中推送音視頻流,尋找很多版本的代碼,C++、Go、Python等語言實現的webRTC協議。
按照搭建難度和快速實現首選Python版本的WebRTC,這種是最適合原型開發的。
選型:C++的開源庫libdatachannel
Python的開源庫AioRTC
libdatachannel:看這個名字,并且對WebRTC協議稍微了解的可能認為它是只實現了WebRTC的datachannel功能。實際不然,它擁有完整的WebRTC的協議內容,并且具有很多示例程序幫助學習,并且有很好的維護狀態。它不像谷歌的WebRTC項目,極其輕量。國產的MetaRTC也是一個很不錯的WebRTC項目,也提供了很不錯的示例代碼,他的示例部分運行效果較差,教程寫的也不是很好,我是沒有完全走通邏輯。
AioRTC:它本身使用的是異步Async IO RTC,都使用Python了代碼的效率就可以先不關心了。
重點學習的地方:
AioRTC項目代碼中,有一個文件夾examples/webcam,安裝完依賴里面的示例代碼可以直接運行。然后在瀏覽器中輸入${那臺電腦的IP}:8080,就能直接看到推送的視頻流,能夠很快的搭建起來一個原型。細心的你會發現,這個過程雖然是使用了webRTC,但是那幾個服務器怎么沒看到?信令服務器,中轉服務器等。當然這幾個所謂的服務器,是為了信息的交換才有的。如果只在本地,webcam示例就是http和js,是使用aiohttp搭建的網頁服務,它實現了一個offer的路由,可以直接將webRTC通信需要的一些參數通過post實現了交換。在網頁端點擊開始按鈕,走的就是這一流程。
libdatachannel項目中,有一個文件夾examples/streamer,里面有個READEME.md介紹了很詳細的當前示例中的如何運行起來信令服務器,網頁服務器,也是相對較為容易得搭建起來一套WebRTC學習環境。這個項目他的編譯方式在其他的README.md有很詳細的介紹,按照流程即可。
那么非常基礎的環境搭建好了,能否使用兩個項目的示例結合進行一些有趣的試驗。很多開源項目的示例可能僅對當前項目內容負責,或者主動兼容其他好的項目。
使用libdatachannel中的示例,搭建起信令和網頁服務器,然后使用AioRTC中的webcam示例將視頻流推送到信令和網頁服務器上,并且能夠正常播放視頻流。
很顯然是可行的,根據搭建的記錄,會發現libdatachannel的信令服務器是使用websockets實現的,那么在webcam示例中將aiohttp移除掉,引用websocket,簡單的修改一下連接到信令服務器,網頁啟動會js自動連接信令服務器,點擊開始會向信令服務器發送request server,信令服務器收到后會把這個request轉發給webcam的ws中,webcam在創建流軌道,把sdp發送給信令服務器,信令服務器將這個sdp轉發給網頁客戶端,下一步網頁服務器會發送本機的sdp給信令服務器,信令服務轉發這個消息給webcam。接下來webcam進行推流,如果順利網頁就能看到視頻了
具體流程:
當前目錄有如下文件
-a---- ? ? ? ? ?2025/7/4 ? ? ?9:56 ? ? ? ? ? 5979 client.js
-a---- ? ? ? ? ?2025/7/4 ? ? ?9:56 ? ? ? ? ? 1428 index.html
-a---- ? ? ? ? ?2025/7/4 ? ? 11:06 ? ? ? ? ? ?984 README.md
-a---- ? ? ? ? ?2025/7/4 ? ? ?9:56 ? ? ? ? ? 2317 signaling-server.py
-a---- ? ? ? ? ?2025/7/4 ? ? 10:34 ? ? ? ? ?11473 webrtc_client.py
?
部署方式參考README.md文件。
參考網頁:Cancy126/learn-webrtc: 簡單的webRTC學習項目,要求:代碼結構非常簡單,極易用于學習。高手勿入