一、问题起因
问题:开发Apple VisionPro应用(以下简称VP),和其他硬件设备建立成功WebRTC连接后,VP视频流没有渲染出来
排查:硬件设备端tcpdump数据,上行数据成功,并有推送给VP对应的IP地址。那要么数据在传输过程中丢了?要么VP接收到数据但没有解码成功?
由于VP无法直接tcpdump数据(需要借助电脑侧虚拟网口,但连接不了电脑),VP版本WebRTC SDK上层也没有输出视频帧数据(如果解码成功,会输出日志),没有数据也没有办法确认是否接收到? 所以重新一个iPhone App,借助其与硬件设备进行WebRTC连接,排查数据流是否有收到以及渲染是否成功
二、tcpdump 基本使用
1、M系列Mac 自带安装有tcpdump,可以tcpdump ---version查看相应版本
uicloud@uiclouddeMacBook-Pro ~ % tcpdump --version
tcpdump version 4.99.4
libpcap version 1.10.4
OpenSSL 3.3.1 4 Jun 2024
2、tcpdump
在 macOS 上监听特定网口中的某个主机的流量,基本步骤操作:
1)确认网口名称
首先,你需要确定要监听的网口名称。可以使用以下命令来列出所有网口:
ifconfig
网口名称通常是类似 en0
、en1
、eth0
等的名称。
2)使用 tcpdump
进行监听
假设你要监听的网口是 en0
,并且目标主机的 IP 地址是 192.168.1.10
,你可以使用以下命令:
sudo tcpdump -i en0 host 192.168.1.10
这条命令的含义是:
sudo
:以超级用户权限运行tcpdump
。-i en0
:指定监听的网口。host 192.168.1.10
:过滤条件,只捕获与192.168.1.10
相关的流量。
3)附加过滤条件(可选)
如果你只对特定的协议或端口感兴趣,可以在 tcpdump
命令中加入更多过滤条件。例如,监听目标主机的 HTTP 流量(端口 80)
sudo tcpdump -i en0 host 192.168.1.10 and port 80
使用 tcpdump
的 ip
过滤器来捕获仅 IPv4 流量。例如,如果你希望监听网口 en0
上的所有 IPv4 流量,可以使用:
sudo tcpdump -i en0 ip
如果你已经在捕获流量但发现有 IPv6 流量,你可以在过滤条件中加入 not ip6
来排除 IPv6 流量:
sudo tcpdump -i en0 not ip6
4)保存到文件(可选)
如果你希望将捕获的数据保存到文件中以供后续分析,可以使用 -w
选项:
sudo tcpdump -i en0 host 192.168.1.10 -w output.pcap
三、iOS tcpdump抓包/流量分析
1、iPhone USB连接电脑
2、通过Xcode查看手机的uuid
3、打开Mac终端,创建虚拟网口( rvictl -s uuid)
uicloud@uiclouddeMacBook-Pro ~ % rvictl -s 00008030-00121140113xxxxx
Starting device 00008030-00121140113xxxxx [SUCCEEDED] with interface rvi0
4、开启抓包
5、结束转包,删除网口(rvictl -x uuid)
$ rvictl -x 00008030-00121140113xxxxx
四、问题发现
通过抓包iPhone App,仍然没有渲染出视频流。但是抓包发现有接收到视频流数据,只是WebRTC SDK 没有成功吐出视频帧数据给上层接口。
20:58:08.483584 IP 192.168.83.167.46522 > 192.168.83.153.54623: UDP, length 76
20:58:08.483597 IP 192.168.83.167.46522 > 192.168.83.153.54623: UDP, length 76
tcpdump: pcap_loop: The interface disappeared
90 packets captured
然后查看Xcode,发现很明显的fail decode frame, 和硬件设备视频编码格式不匹配。
至此,曲线救国的方式,排查出VP可能存在同样问题,匹配并对应好视频编解码格式,即可正常渲染。
附:
Record and Analyze a Packet Trace on a Mac Recording a Packet Trace | Apple Developer Documentation