首页 > 其他分享 >webrtc 的datachannel在golang中的使用

webrtc 的datachannel在golang中的使用

时间:2024-06-30 23:23:19浏览次数:1  
标签:datachannel OnDataChannel dc golang func OnMessage webrtc

因为在发送端需要接收一些接收端的统计信息,而且具有不可丢失的需求,所以采取利用datachannel进行传输。datachannel是基于sctp协议的传输通道,sctp可提供按需可靠到达的服务,在datachannel中可以设置是否按序,是否可靠,最大重传次数,数据最大保存时间(当数据超过保存时间仍未发出时将被丢弃)。默认按序可靠传输,并进行带内协商。
带内协商意味着在datachannel的发起方创建datachannel,当接收方监听到datachannel时获取datachannel句柄。具体而言,在sender端,利用Dc:=webrtc.peerconnection.CreateDataChannel("states", &webrtc.DataChannelInit{})创建datachannel对象,"states"为我们的自定义Label,&webrtc.DataChannelInit{}为默认设置。
创建完成后有一些事件:OnMessage,OnDataChannel,OnOpen等,这三个是我在程序中采用的。其中OnMessage负责在需要接收消息的一端进行收听所需消息(无论是发起者还是收听者都可能会需要接收消息,两端都可以用OnMessage),OnDataChannel在接收端进行监听DataChannel,文档中这样描述它: OnDataChannel sets an event handler which is invoked when a** data channel message** arrives from a remote peer.另外我们需要注意在OnMessage的描述中为 OnMessage sets an event handler which is invoked on a binary message arrival over the sctp transport from a remote peer. OnMessage can currently receive messages up to 16384 bytes in size. Check out the detach API if you want to use larger message sizes. Note that browser support for larger messages is also limited.两者从说明上来看是有区别的。另外要注意一点OnMessage说明是a binary message arrival,但实际上我们在数据通道中还支持发送字符串,不过我为了避免麻烦并没有去尝试Dc.Sendtxt()函数,有兴趣的读者可以进行尝试。在接收端中, OnDataChannel的调用为peerConnection.OnDataChannel(func(dc *webrtc.DataChannel) {your function})获取到datachannel对象dc,并在your function中对dc进行操作,比如读取,发送,关闭。发送示例:

peerConnection.OnDataChannel(func(dc *webrtc.DataChannel) {
		// Register channel opening handling

		dc.OnOpen(func() {
			for {
				buf := make([]byte, 4)
				mutex.Lock()
				binary.LittleEndian.PutUint32(buf, uint32(value))
				err := dc.Send(buf)
				if err != nil {
					print(err)
				}
				mutex.Unlock()
				time.Sleep(1000 * time.Millisecond)
			}

		})
	})

在另一端进行接收利用

Dc.OnMessage(func(msg webrtc.DataChannelMessage) {
						fmt.Println(msg.Data)
						println(len(msg.Data))
						bufBinary := bytes.NewBuffer(msg.Data)
						binary.Read(bufBinary, binary.LittleEndian, &buffer)
						println("buffer time", buffer)
					})

OnOpen个人猜测只要底层的datachannel没断开就会一直处于调用状态。
接下来推荐一个看到的比较简洁的示例https://gist.github.com/enobufs/7d8e2996022658b31c04019afac91393

另外要注意到一点的是,datachannel的调用不能在webrtc的OnTrack事件中进行,OnTrack用于接收远程的track传来的流。也就是说peerConnection.OnTrack(func(track *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) {peerConnection.OnDataChannel(func(dc *webrtc.DataChannel) {}}是不行的,虽然不会报错但是会发现无法接收datachannel上的数据。

标签:datachannel,OnDataChannel,dc,golang,func,OnMessage,webrtc
From: https://www.cnblogs.com/wxL-videostreaming/p/18277141

相关文章

  • Golang文件操作
    文件是数据源(保存数据的地方)的一种,word文档,txt文件,excel文件...都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音...os.file封装了所有对文件的操作,且file是一个结构体: 打开和关闭文件1.打开文件,用于读取: 传入的是一个字符......
  • 【九】【QT开发应用】WebRTC的sigslot源码和使用WebRTC的sigslot使用编写信号槽
    WebRTC(WebReal-TimeCommunication)是一个开源项目,提供实时通信能力,广泛应用于视频、音频和数据传输。在WebRTC的实现中,sigslot库用于信号和槽机制,以实现事件驱动的编程模型。WebRTC的sigslot部分主要实现了信号和槽的机制,用于简化组件之间的通信和事件处理。WebRTC使用si......
  • golang使用grpc
    (1)安装protoc,这是通用的,所有语言都需要​#下载网址:https://github.com/protocolbuffers/protobuf/releases/download/v3.9.0/protoc-3.9.0-win64.zip解压后将将protoc的bin目录添加到环境变量中 如果不会添加环境变量请百度运行protoc--version查看是否已经添加到环境......
  • [Golang并发]GMP模型
    什么是GoroutineGoroutine=Golang+Coroutine。Goroutine是golang实现的协程,是用户级线程。Goroutine的特点:相比线程,其启动的代价很小,以很小栈空间启动(2Kb左右)能够动态地伸缩栈的大小,最大可以支持到Gb级别工作在用户态,切换成很小与线程关系是n:m,即可以在n个系统线程上多......
  • [Golang基础]Goroutine
    协程(CoRoutine)是一种轻量级的用户态线程。简单来说,线程(thread)的调度是由操作系统负责,线程的睡眠、等待、唤醒的时机是由操作系统控制,开发者无法决定。使用协程,开发者可以自行控制程序切换的时机,可以在一个函数执行到一半的时候中断执行,让出CPU,在需要的时候再回到中断点继续执行。......
  • [Golang并发]Sync.Mutex
    源码//Copyright2009TheGoAuthors.Allrightsreserved.//UseofthissourcecodeisgovernedbyaBSD-style//licensethatcanbefoundintheLICENSEfile.//Packagesyncprovidesbasicsynchronizationprimitivessuchasmutual//exclusionlocks.......
  • [Golang并发]Sync.map
    sync.Map的实现原理可概括为:通过read和dirty两个字段将读写分离,读取时会先查询read,不存在再查询dirty,写入时则只写入dirty,所以read相当于dirty的缓存。读取read并不需要加锁,而读或写dirty都需要加锁。misses字段统计read被穿透的次数,被穿透指需要读dirty的情......
  • golang如何使用指针灵活操作内存?unsafe包原理解析
    Hi你好,我是k哥。一个大厂工作6年,还在继续搬砖的后端程序员。我们都知道,C/C++提供了强大的万能指针void*,任何类型的指针都可以和万能指针相互转换。并且指针还可以进行加减等算数操作。那么在Golang中,是否有类似的功能呢?答案是有的,这就是我们今天要探讨的unsafe包。本文将深入探......
  • golang runtime.Caller 获取调用堆栈信息, Caller(1) 和 Caller(2) 的区别
     funcwhoCalledMe(){//获取调用堆栈信息_,fileName,lineNo,ok:=runtime.Caller(2)if!ok{fmt.Println("Failedtogetcallerinformation")return}fmt.Printf("Calledfrom:%s:%d\n",fileName,lineNo......
  • golang openai GPT4o 示例代码
    packagemainimport( "context" "errors" "fmt" "io" "log" "os" "github.com/joho/godotenv" openai"github.com/sashabaranov/go-openai")funcmain(){ err:=godoten......