ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Pion流媒体服务测试

2021-12-28 10:02:37  阅读:205  来源: 互联网

标签:流媒体 sdp 测试 Pion base64 Session rtp 模块 go


        项目原因,测试了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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有