由于大流行的原因,Zoom 等视频会议工具在全球范围内变得非常流行。在本教程中,我将指导您使用 Golang 创建一个视频会议应用程序。
可以在此处找到带有注释的完整代码https://github.com/Ramez-/go-video-confrence。
我们将使用 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 举报,一经查实,本站将立刻删除。