关于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掉哦。有什么问题的可以指出,相互学习才会节省更多的精力。

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