使用 Go webRTC 从零搭建功能齐全的视频会议应用程序

由于大流行的原因,Zoom 等视频会议工具在全球范围内变得非常流行。在本教程中,我将指导您使用 Golang 创建一个视频会议应用程序。

可以在此处找到带有注释的完整代码https://github.com/Ramez-/go-video-confrence。

使用 Go webRTC 从零搭建功能齐全的视频会议应用程序

我们将使用 webRTC 来开发点对点通信。WebRTC 允许访问媒体设备、打开对等连接、发现对等点并开始流式传输。

WebRTC 具有许多功能,对于一篇文章来说可能非常复杂,我不会详细解释每个概念。

WebRTC 由 3 个主要部分组成

  • MediaStream:允许访问用户机器上的媒体,即摄像头和麦克风
  • RTCPeerConnection:建立对等连接
  • RTCDataChannel:为任意数据的双向连接创建对等点之间的通道(我们不会将其用于我们的视频会议应用程序)

随着我们的实施,我们将解释 webRTC 中的不同概念。

执行:

一、安装pion webRTC

我们首先创建我们的 peerConnectionConfig,这意味着我们注册一个信令服务器来帮助我们发现信息,例如要连接的 IP 地址和端口。这个过程称为信令。

peerConnectionConfig := webrtc.Configuration{
		ICEServers: []webrtc.ICEServer{
			{
				URLs: []string{"stun:stun.l.google.com:19302"},
			},
		},
	}

我们需要定义我们的媒体引擎,它定义了 peerConnection 支持的编解码器。然后我们可以注册您要用于的编解码器,这里我们使用的是VP8。

m := webrtc.MediaEngine{}
m.RegisterCodec(webrtc.NewRTPVP8Codec(webrtc.DefaultPayloadTypeVP8, 90000))
api := webrtc.NewAPI(webrtc.WithMediaEngine(m))

下一步是创建我们的会话描述协议 (SDP)。SDP 用于对等点之间的协商。

为了简化实施,我们将从实施 Alice 向 Bob 流式传输视频开始。

WebRTC 要求 Alice 和 Bob 发起通信,提供报价和答案。两者都将在 UI 端创建他们的 SDP 产品(我将在另一篇文章中讨论)。然后他们会将其发送到我们的 Go 服务器。服务器需要为 Alice 和 Bob 创建 peerConnection 对象,这将使用 SDP 提议并创建 SDP 应答。offer 被设置为远程描述,而 answer 被设置为 peerConnection 对象的本地描述。

type Sdp struct {
	Sdp string
}

func main() {
    var session Sdp
    offer := webrtc.SessionDescription{}
    // Create a new RTCPeerConnection
    // this is the gist of webrtc, generates and process SDP
    peerConnection, _ := api.NewPeerConnection(peerConnectionConfig)
    
    // Set the SessionDescription of remote peer
    peerConnection.SetRemoteDescription(offer)

    // Create answer
    answer, _ := peerConnection.CreateAnswer(nil)
    
    // Sets the LocalDescription, and starts our UDP listeners
    err = peerConnection.SetLocalDescription(answer)
  
  }

Pion 上的视频会议完全是关于轨道的。Alice 将需要使用 Alice 的 PeerConnection 对象创建轨道。我们将以某种方式缓存此曲目,以便 Bob 可以查询缓存以获取曲目。Bob 将使用轨道来监听 Alice 的 UDP 流量。

看起来很简单,但是,有一个小挑战。我们确定 Alice 会在 Bob 之前连接吗?如果 Bob 先连接,他怎么能等到 Alice 创建轨道呢?好吧,这里 go 最令人惊讶的特性之一将帮助我们,Channels。我们将使用频道让 Bob 等到 Alice 连接并为视频通话创建她的轨道。

func recieveTrack(bobPeerConnection *webrtc.PeerConnection,
	peerConnectionMap map[string]chan *webrtc.Track,
	AlicID string) {
	if _, ok := peerConnectionMap[AlicID]; !ok {
		peerConnectionMap[AliceID] = make(chan *webrtc.Track, 1)
	}
	localTrack := <-peerConnectionMap[AliceID]
	bobPeerConnection.AddTrack(localTrack)

在上面的示例中,PeerConnectionMap 用作将传递轨道的通道的 peerID 缓存。如果 Alice 先连接,那么当 Bob 连接时,他会找到包含轨道的频道。否则,Bob 将一直等待,直到 Alice 通过通道中的轨道。

现在我们有了视频流应用程序,让我们将其扩展为视频通话应用程序。这可以通过复制视频流应用程序来完成,但在这种情况下,Bob 将流式传输给 Alice。

将所有内容放在一起,我们将需要一个端点,以便我们的 UI 可以创建一个 HTTP 请求来启动信号处理过程。对于我们的示例,Alice 将创建两个 HTTP 请求。一个请求作为发送者,另一个作为接收者。Bob 也需要这样做。无论谁先连接,通道总是让其他用户等待。我们将使用gin来开发我们的 HTTP 端点。

router := gin.Default()

router.POST("/webrtc/sdp/m/:meetingId/c/:userId/p/:peerId/s/:isSender", func(c *gin.Context) {
		isSender, _ := strconv.ParseBool(c.Param("isSender"))
		userID := c.Param("userId")
		peerID := c.Param("peerId")
    })

router.Run(":8080")

最后,希望您对使用 Golang 实现视频会议应用程序的服务器端有一个大致的了解。在下一篇文章中,我将继续介绍视频会议应用程序的 UI 部分。

作者:Ramez

原文链接:https://medium.com/@ramezemadaiesec/from-zero-to-fully-functional-video-conference-app-using-go-and-webrtc-7d073c9287da

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(3)

相关推荐

发表回复

登录后才能评论