關於webrtc中使用DataChannelInterface進行普通數據的傳輸的若干問題。

    使用webrtc 3.5.1進行peertopeer數據傳輸的時候,既可以傳輸多媒體數據(視頻 、音頻數據),也可以傳輸普通的數據(二進制數據、文本),關於多媒體數據的傳輸,webrtc自帶的demo中已經講的很詳細了 ,在此不再熬述,基本上就是重載相關的多媒體類,再覆寫父類中繼承來的一些虛擬成員函數。使用datachannel傳輸普通數據的方式和傳輸多媒體數據的時候差不多,因爲本版本webrtc的demo中並沒有詳細介紹datachannelinterface的使用,所以在剛開始的時候不知道從哪入手,水平有待提高啊,類比法很重要的,這在設計良好的開源庫中都是有很好的體現的,下面我將介紹我最近對webrtc的使用的一點小小的心得,水平有限,有不對的地方不要忘記噴我~~

    webrtc使用DataChannelInter接口來處理非多媒體(區別於視頻和音頻數據)的數據的傳輸,多媒體數據是將數據類添加到多媒體軌道(track)上,再將多媒體軌道添加到 多媒體流(stream)中,而多媒體流是綁定在當前peerconnection上的,每個DataChannelInterface要想傳輸數據還得要註冊(rtc::scoped_refptr<webrtc::DataChannelInterface>::RegisterObserver)一個基於DataChannelObserver的派生類,在其中覆寫相關的函數,這個過程中一定要記得在成員函數後添加ovveride關鍵字,比如OnMessage函數,如果不寫datachannel中的消息將不會觸發OnMessage函數。

    經過上述的操作後,datachannel數據消息的響應的問題是解決了,接下來就是該怎麼將數據傳輸給對面! DataChannel使用Send(const DataBuffer& buffer)函數來發送數據,使用OnMessage(rtc::Message* msg)來接收數據,DataChannel::OnMesage將會觸發DataChannelObserver派生類的OnMessage函數,所以消息傳遞的路徑也就閉合了。還記得前面說的DataChannel的Send()函數嗎,Send函數的參數是const DataBuffer& buffer的結構,DataBuffer的構造方式有兩種,分別爲DataBuffer(const rtc::CopyOnWriteBuffer& data, bool binary)和 DataBuffer(const std::string& text),第一種可以使用多種類型的數據來初始化DataBuffer,第二種只能使用string類型的數據來初始化,第一種方式支持二進制數據、自定義類型數據,功能很強大,至此完成了對 對 DataChannel數據傳輸的粗略介紹。

    另外還有一個問題需要說一下,在將自定義類型轉化爲DataBuffer的時候,最好不要使用指針轉換的方式,譬如uint8_t * data =reinterpret_cast<uint8_t*>data1, data1爲自己想要發送的數據 ,這樣會導致data1的數據丟失,最好採用uint8_t * data = new uint8_t[size];  ::memcpy(data, message, size); 的方式轉換,最後不要忘記delete掉哦。有什麼問題的可以指出,相互學習纔會節省更多的精力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章