前言
无线投屏开发过程中,时常遇到解码显示出来的图像存在绿边或者花屏的问题。一般而言,此类问题的原因有以下两种:
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