前言
sipp是一款用于测试SIP的命令行工具,普通情况下,我们主要用来测试的是SIP信令,而要测试媒体,其提供对PCAP抓包的读取以及发送功能支持,但是在多次实验的情况下,其每次也只能单独发送音频流/视频流。并且要循环时间较长的会比较麻烦。后来通过配合使用ffmpeg自带的发包功能,可以实现直接读取mp4/mkv/avi文件并实现同时发送音视频报文的功能!
测试脚本
相关的脚本已经提交到GitHub!https://github.com/elkpi/sipp_media
测试思路说明
如果对sipp有所了解,就知道sipp只是一个SIP协议测试框架,所有的信令都是写入到xml的测试脚本,因此非常的方便!普通媒体协商下,可以实现接收流的功能,也就是在SDP中指定相关的媒体信息。sipp支持在接收到报文后调用脚本的功能!
因此思路为,将接收到的SDP传递给shell脚本,shell脚本解析SDP的对端IP:PORT,之后调用ffmpeg读取avi媒体文件向远端打流!具体脚本实现为play.sh
提交的仓库中的脚本是一个被叫的流程!如果需要实现主动呼叫,本质也是可以的,就是解析200OK的SDP再去调用ffmpeg来打流!
使用说明
环境要求
- 系统:Linux/MacOS;由于Windows不方便使用bash以及sipp,因此没有Windows支持!
- SIPp:
- Ubuntu: sudo apt install sip-tester 安装sipp,当然也可思议自编译
- MacOS:brew install sipp
- ffmpeg:
- Ubuntu: sudo apt install ffmpeg
- MacOS: brew install ffmpeg
- 二进制编译文件:(还是比较推荐这种形式的,方便!)
- SIP服务器:为了方便,使用kamailio作为SIP服务器,并且开启任意注册支持(任意帐号及密码都可以注册)
- bash支持!
以上就是环境的简单要求!
生成测试avi文件
如果有所了解,那么就会知道,除了脚本之外,最重要的还是这个媒体文件!可以直接使用ffmpeg来生成!并且由于一些测试的需求,最好是按自己的要求来定制GOP/音频编码等,因为如果涉及到视频的转码,对于打流的设备要求比较高,加上如果需要同时多条流一起打,压力会更大!因此,我个人建议是实现把需求的媒体文件做好!如下一个ffmpeg转换的示例:
ffmpeg -i src.mkv -c:v libx264 -g 250 -s 640x480 -r 30 -b:v 768k -profile:v baseline -x264-params "nal-hrd=cbr" -c:a pcm_alaw -ac 1 -ar 8k 640_480_gop250.avi
上面就是转行为一个GOP为250,分辨率大小为640×480,帧率为30,并且为cbr固定码率为768k的视频。音频则为PCMA!这里要特别说一下,其实对于一些音频格式,比如MP3/AAC都是有比较高的压缩率的(相对于G711这类的),而SIP测试中大量用的是G711,因此直接存储G711这种省去部分转码压力,但是音频发包不同于视频发包,不好直接拷贝,最终还是要过一个filter,因此尽量降低音频转码的压力!而选用AVI这个容器格式,是因为AVI对封装要求较低。如果使用MP4这类格式,是不支持G711的(有一大部分的播放器可能解码不出来,因为header没有对应G711的值)
配置说明
给出的仓库脚本中是不带SIP注册认证的,如果需要认证,自己要再修改下!
account.csv:这个文件是SIP注册帐号列表,目前我只写了一个帐号,如果需要多个帐号进行测试,可以用shell生成帐号列表!
list.txt:ffmpeg播放列表,也就是把上文中的媒体文件写进来,如果需要长时间烤机,则多写几行!比如一个大的视频文件是1小时,写个10行可以测试10小时!
run.sh:运行的脚本,需要修改脚本中LOCAL为打流测试的地址;SRV为注册服务器的地址;CSV则是注册帐号列表!M为执行test calls数量!提供直接通过运行带参数的形式来修改:
usage: ./run.sh [OPTION]
-l <LOCAL IP ADDR>
-s <SIP SRV IP:PORT, e.g. 192.168.78.8:5060>
-c <ACCOUNT LIST CSV FILE>
-m <test Calls>
-h show usage
./run.sh -l 192.168.78.6 -s 192.168.78.8:5060 -c account.csv -m 2000
通过单独带参数来修改对应的一些字段!
play.sh:用于执行ffmpeg打流的脚本文件。支持G711以及G722,如果有其余的编码支持,可以修订下脚本!
reg.xml:sipp注册的配置,根据自己需求做一些修订!
media.xml:invite被叫响应SDP以及调用play.sh的配置!也是根据自己的需求,做一些修订!
运行说明
上文配置管理已经有说过了,可以直接执行run.sh!
存在的问题
如果执行压力测试,运行好几路进行测试,由于是shell执行,存在sipp崩溃的问题,以及ffmpeg可能没有被正常杀掉的情况(BYE没有收到,导致可能遗留一些打流ffmpeg子进程)
转载请注明: 转载自elkPi.com
本文链接地址: sipp测试脚本用于媒体测试
2020年7月4日
hi 博主你好,想请教下,你之前一直freeswitch到Android,还有后续更新吗?就是想确认下是否可行呢,性能怎么样?希望百忙之中可以回复一下,万分感激。
2020年7月4日
可以正常运行,但是由于Android系统会吃掉不少资源,所以最后还是切换为Linux的方案了。加上Android要移植不少库,也算是吃力不讨好吧。之前用的是海思的芯片~
2020年7月4日
感谢回复,还有一点疑问,移植到Android使用什么方式使用?自己写套JNI映射调用吗?还是?
2020年7月4日
FS作为服务端,并没有APK直接调用,我们有自己的FS管理器,管理器去调用而已,你如果想要控制FS,可以实现ESL对接,异步控制也是没问题的
2020年7月4日
好的,感谢。
2020年7月4日
对了你提交到github服务器上到代码,编译出来可以正常跑吗
2020年7月4日
可以啊 不过Android的版本比较低,海思那时候给的是Android 4.4 理论上高版本应该也是可以的,都是NDK编译的,应该没什么问题
2020年7月4日
好的,我试试看,因为对这方面不太了解,感谢你耐心的回答。🙏🙏
2020年7月4日
没事,客气了。可以都玩玩,毕竟Android也是Linux!不过当初用的FS版本也不是很高。
2020年7月4日
哈哈哈,是的,想玩下,现在你的版本上跑起来,到时候在研究下怎么升级到新到版本。
2020年7月4日
嗯,现在旧手机很多,整一个旧的手机,root后,其实可玩性还是不错的!
2020年7月4日
嗯,到时候如果遇到一些问题,如果你有空的话,再请教下你。你网站的评论系统好想有点问题,越来越小了,看不到了,哈哈哈
2020年7月4日
主题的问题,会一直嵌套缩进。
2020年7月4日
使用了你GitHub上的代码,./compile.sh编译提示,no usable libjpeg; please install libjpeg devel package or equivalent这个错误,然后我看到build_3rd.sh这里会编译1.5.2的版本,当我单独执行build_3rd.sh这个脚本,会提示configure: error: cannot find install-sh, install.sh, or shtool in “.” “./..” “./../..”这个错误。请教下这个是什么原因呢?
2020年7月4日
你用的系统是什么?要安装一些开发环境才行,你没有开发环境执行一些操作会失败的!
2020年7月5日
我用的是Ubuntu 20.04,开发环境应该都装了。在compile的时候,提示的错误,我看了下,是configure.ac检查的时候, AC_CHECK_LIB(jpeg, jpeg_std_error,, AC_MSG_ERROR([no usable libjpeg; please install libjpeg devel package or equivalent])),提示的错误。我在系统也尝试装了libjpeg-turbo也不行。
2020年7月5日
版本那么高! NDK用的是多少的版本,我之前用的版本也不高的,用的android-ndk-r10e-linux-x86_64,我之前是用centos7编译的,这个是因为默认我的脚本并没有set -e 所以是libjpeg没编译通过还继续执行了。在Ubuntu上编译的话,我是没试过。
2020年7月5日
嗯,有可能是系统的问题,我看看直接先编译一下libjpeg成功了,再运行下一段。不行再弄个centos7试试看,NDK版本是和你用的一样的。