其他分享
首页 > 其他分享> > Pion流媒体服务测试

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