Pion流媒体服务测试
作者:互联网
项目原因,测试了Pion流媒体服务器,将测试过程记录一下,方便日后查阅。
1)概述
Pion是一套WebRtc框架API,由Go语言编写。原文的描述:A pure Go implementation of the WebRTC API。大部分人对于没有main或者多个main函数的go工程不太好理解,本项目就是其一。也是搜索了好多资料才明白如何使用。总体来说使用起来还是相对比较简单,起码比kurento的API简单,自然也没有kurento功能强大。
2)代码获取
https://github.com/pion/webrtc
3)代码结构
示例代码均在examples文件夹下,从示例看起更加容易上手。
4)准备工作
CMD进入项目目录,通过go mod 更新项目依赖。不清楚的,可以自行搜索。
go mod tidy
5)运行
cmd进入examples目录,运行“go run examples.go”。
在浏览器输入“http://localhost:8081”,如下图所示。
Data Channels、Data Channels Create、Data Channels Close、Data Channels Detach四个模块是数据通信模块,用于收发消息使用。
Reflect模块,反射模块,自己发送的音视频数据,服务端再返回给客户端显示。
Pion to Poin模块,主要用于服务间数据互通。
Play from Disk模块:通过webrtc播放本地的音视频文件。
Broadcast模块:用于多调一,一人发布视频,多人调阅查看。
RTP Forwarder:用于将webrtc视频流转化为RTP视频流,发送到固定的端口。
RTP to WebRtc:从固定端口接收RTP视频流,并将其转化为Webrtc视频流。
其他的几个模块没有测试,不再介绍。本次测试重点内容为音视频测试,操作步骤和音视频的类似。
6)测试
Pion客户端与服务端互通的核心思想是,SDP的交换(SDP通过base64编码)。只要客户端与服务端SDP能够交换成功,双方便可以连接成功。
测试1:Broadcast模块测试
a)Web打开broadcast模块,选择“Publish a Broadcast”。Browser base64 Session Description中就是网页本地的SDP信息。
注:网页打开一会后才会出现。如要加速,可将jsfiddle目录下的demo.js中的iceservers删除掉,对应go文件中也是同样的方法加速sdp生成,但是公网测试时,需要搭建一个可用的ICE服务器。
b)cmd进入Broadcast目录下,输入go run main.go。运行服务。
c)在postman中输入http://localhost:8080/sdp,POST方法,在body中选择raw,将网页中的sdp粘贴进入,之后点击发送请求。(官方推荐的是curl localhost:8080/sdp -d "$BROWSER_OFFER"`命令发送请求,但windows平台还是postman比较方便。)
d)在go界面便会生成Answer sdp消息,在cmd界面右键标记,选择cmd窗口生成的SDP消息,再点击右键复制。(无需调整格式)将answer sdp复制到web界面的Golang base64 Session Description文本框中,点击“Start session”,如果出现connected,则说明视频发布成功。
e)新打开web界面访问Broadcast->Join a Broadcast。
f)将界面生成的Browser base64 Session Description复制出来。
g)重新执行步骤c,在cmd页面复制新生成的answer sdp消息。
h)将复制的sdp消息填入Golang base64 Session Description文本框中,点击“start Session”按钮,即可查看到Publish发布的视频。
测试2:RTP Forwarder模块发送RTP,RTP to WebRtc接收RTP数据并播放。
a)Web打开RTP Forwarder模块,界面如下图所示。
Browser base64 Session Description中就是网页本地的SDP信息。
let pc = new RTCPeerConnection({
iceServers: [
{
urls: 'stun:stun.l.google.com:19302'
}
]
})
修改成如下:
let pc = new RTCPeerConnection()
b)在rtp-forward文件夹中,创建a.txt,将网页中Browser base64 Session Description对应文本框内的文本粘贴进入保存。
c)cmd进入rtp-forward文件夹,go run main.go<a.txt。
右键标记,选择cmd窗口生成的SDP消息,再点击右键复制。(无需调整格式)
d)回到刚才的网页,将SDP内容直接粘贴到Golang base64 Session Description文本框中,点击“Start Session”即可建立连接。
e)界面出现“connected”,表示连接成功。在该模块的main.go中查看rtp的接收端口。
f)新打开浏览器,打开Broadcast->Join a Broadcast来查看rtp to webrtc输出的视频流。
复制该页面生成的Browser base64 Session Description,将其复制到rtp to webrtc模块的文件夹中创建a.txt,保存。
g)修改rtp to webrtc模块的main.go文件夹中监听的rtp端口,和上面的端口保持一致。
音频端口,暂且不处理。
h)cmd 进入rtp to webrtc目录,go run main.go< a.txt。运行程序。
i)将生成的answer sdp,同样的方法,复制,粘贴到broadcast页面的Golang base64 Session Description文本框中,点击查看,即可查看到对端的视频。
7)总结
针对上述测试2,看起来好像是多余的无用过程,但是如果能将webrtc转化为rtp,我们是不是可以对rtp做一些处理后,在通过rtp to webrtc发布出去呢。毕竟我们对于rtp更加的熟悉,留给有需要的人思考吧。
总体来说,Pion还是使用起来还是比较简单方便的,没有复杂的交互流程,仅需要双方交换sdp即可联通。但有一个问题是Pion不支持trickle ice。在存在私网穿越的应用场景下,可能会耗费更多的ICE candidate搜集时间以及连接建立时间。
标签:流媒体,sdp,测试,Pion,base64,Session,rtp,模块,go 来源: https://blog.csdn.net/eennddyy/article/details/122170007