Tcpdump中导出Mpegts流

前言

无线投屏开发过程中,时常遇到解码显示出来的图像存在绿边或者花屏的问题。一般而言,此类问题的原因有以下两种:
1.解码器解码出错;
2.原始数据流存在问题;
而Tcpdump抓包可以帮助我们进一步定位问题点。

抓取Tcpdump数据

Linux环境下,以GXV设备为例,当前设备已连接Airplay。我们通过adb shell以及ifconfig指令确定当前设备Airplay RTSP连接的网卡。

adb shell
ifconfig

网卡名称由对应项目的网络模块代码决定,项目工程不同,对应的网卡名称可能不同,无法确定相关名称时,可以对比连接前后网卡变化。GXV的Airplay 采取的是本地模拟的RTSP连接,因此网卡为“lo”

图片

根据对应的网卡,使用tcpdump命令抓取。

tcpdump -i lo -s 65534 -w /tmp/tcpdump.pcap
//-i:监听的网卡 -s:每一帧的上限大小 -w:指定保存位置

执行合适的时间后,通过Ctrl+C 终止抓取。

至此,我们可以获得对应的Tcpdump抓包。后续可以通过adb pull 指令,拉取到本地电脑进行解析。
注:Airplay尽量从连接操作前,便开始抓包。避免出现无法解码的问题出现。

下载安装mpegts流插件

当前开发环境下,我们一般使用Wireshark这一程序来读取Tcpdump抓包数据。Ubuntu18.04环境下我们可以使用指令安装Wireshark。已安装的同学可以忽略

sudo apt-get install wireshark

安装完毕后,我们需要添加对应的导流插件,下载地址如下:
https://wiki.wireshark.org/mpeg_dump.lua?action=AttachFile&do=view&target=mpeg_packets_dump.lua

我们将mpeg_packets_dump.lua 复制到Wireshark的脚本路径
Ubuntu上Wireshark默认地址如下:/usr/lib/x86_64-linux-gnu/wireshark/plugins/
重启Wireshark后,我们便可以发现工具栏中多出一个插件“Dump MPEG TS Packets”.

导出播放TS流

使用Wireshark打开Tcpdump文件,上面展示的UDP包即是我们需要导出的数据。此时我们还不能直接导出,需要将其二次解码成RTP数据。
我们鼠标右键点击任意一条UDP包,选择decode as(解码为)选项,在选项列表中选择RTP后确认。

至此,我们可以发现绝大部分UDP包的标识都转换为MPEG TS包。

选中任意MPEG TS包,并开启插件,输入对应的文件路径即可。需要注意的是,文件需以ts作为后缀名。

至此ts流导出完毕,我们可以使用ffplay指令直接预览,来确定对应的原始图像是否正确

ffplay bbb.ts
//若没有ffplay,则执行以下指令安装:sudo apt install ffmpeg

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/93817.html

联系我们
联系我们
分享本页
返回顶部