前言
sipp是一款用于测试SIP的命令行工具,普通情况下,我们主要用来测试的是SIP信令,而要测试媒体,其提供对PCAP抓包的读取以及发送功能支持,但是在多次实验的情况下,其每次也只能单独发送音频流/视频流。并且要循环时间较长的会比较麻烦。后来通过配合使用ffmpeg自带的发包功能,可以实现直接读取mp4/mkv/avi文件并实现同时发送音视频报文的功能!
测试脚本
测试思路说明
如果对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
1
ffmpeg-isrc.mkv-c:vlibx264-g250-s640x480-r30-b:v768k-profile:vbaseline-x264-params"nal-hrd=cbr"-c:apcm_alaw-ac1-ar8k640_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
-s
-c
-m
-h show usage
./run.sh -l 192.168.78.6 -s 192.168.78.8:5060 -c account.csv -m 2000
1
2
3
4
5
6
7
8
usage:./run.sh[OPTION]
-l
-s
-c
-m
-hshowusage
./run.sh-l192.168.78.6-s192.168.78.8:5060-caccount.csv-m2000
通过单独带参数来修改对应的一些字段!
play.sh:用于执行ffmpeg打流的脚本文件。支持G711以及G722,如果有其余的编码支持,可以修订下脚本!
reg.xml:sipp注册的配置,根据自己需求做一些修订!
media.xml:invite被叫响应SDP以及调用play.sh的配置!也是根据自己的需求,做一些修订!
运行说明
上文配置管理已经有说过了,可以直接执行run.sh!
存在的问题
如果执行压力测试,运行好几路进行测试,由于是shell执行,存在sipp崩溃的问题,以及ffmpeg可能没有被正常杀掉的情况(BYE没有收到,导致可能遗留一些打流ffmpeg子进程)