如果图片不是很清晰,
请下载附件的PDF查看高清版本:协作设备抓包后提取H263,H264视频流
在协作设备的排错过程中,大多数时候我们得到了呼叫的抓包文件,只专注于分析丢包率、流控信息等其它对于排错关键的数值信息。
为了得到更加直观的信息来进行排错。通过我的多次尝试,只要我们写出对应的SDP文件并且导入VLC播放器,再使用rtptools作为媒体服务器播放,就能模拟数据包内的RTP流,向本地播放器发送视频信号。
不论是双流信号还是双向的视频流信号,都能被轻松解码成本地播放器能够播放的视频。
使用情形
解码数据包内RTP Stream承载的视频流,并且在本地播放以验证清晰度、传输质量等。
目前主流的视频编解码协议是H263和H264,但H264更常用。
本方法适用于SIP发起的未加密的呼叫:SIP over TCP/UDP
原理
1. 提取数据包中的RTP流,保存为rtpdump文件,使用rtptools包含的rtpdump工具打包成rtpplay工具能够播放的文件,并且使用rtpplay工具作为服务器在本地播放这个RTP流。
2. 根据数据包内的SDP信息编写对应的SDP文件,使用VLC播放器打开这个SDP文件作为客户端接收rtpplay发来的RTP流,解码并播放视频。
所需工具
1. Wireshark
2. rtptools
3. VLC播放器
操作过程
从Wireshark提取RTP Stream,打开待分析的包,点击:
选中需要分析的呼叫,点击Flow:
记录H264对应的SSRC:
打开RTP>>Show All Streams
通过SSRC
找到对应的H264
流,点击Save As
取个名字,不带后缀名,点击OK。
2. 打包RTP流;打开Windows的命令行, 切换到rtptools的目录,或者预先将此目录加入Path变量中
使用rtpdump工具打包RTP流,成为rtpplay工具可播放的格式:
rtpdump –F dump –f ..\RTPtest –o RTPtest.rtp
-F参数指定payload类型
-f 参数指定源文件
-o 参数指定目标文件
3. 编写SDP文件,使用Wireshark查看这通呼叫的最后一个ACK SDP消息: 根据SDP中的Video信息,编写一个最简单的SDP文件,用于VLC播放器作为客户端接收媒体流。
testRTP.sdp 在127.0.0.1:5002接收H264视频流
m=video 5002 RTP/AVP 126
c=IN IP4 127.0.0.1
a=rtpmap:126 H264/90000
a=fmtp:126 profile-level-id=428016;packetization-mode=1;max-mbps=69500;max-fs=2304;max-cpb=200;max-br=5000;max-rcmd-nalu-size=884736;max-smbps=69500;max-fps=6000
4. 使用VLC导入SDP文件,并开始播放(因为RTP/RTCP需要校验包头,需要先打开客户端)
点击打开网络串流:
按下图进行设置并且添加刚刚编写的SDP文件。
设置完成后点击播放:
5. 使用rtpplay作为服务器端发送视频流,在127.0.0.1:5002发送
rtpplay –T –f RTPtest.rtp127.0.0.1/5002
回车后可以看到VLC播放器开始正常播放视频:
扩展
如果需要加入音频流,可以在SDP文件中加入对应的行,并且再开启一个命令行窗口运行rtpplay工具来发送音频即可。
是不是非常有趣~~我正在研究使用这种方式播放更多的视频,还有如何使用Wireshark解码出H264的裸码流,可以直接使用比如“暴风影音”这样的软件直接播放。