0x1 简介
抖音是最近火热的短视频app, 本文通过抓包来分析douyin的在线视频播放过程。
通过分析,可以知道其播放流程如下,
server是指保存用户上传内容(UGC)的服务器,客户端连接到该服务器下载需要播放的内容。
其它三个模块(downloader, local streamer, local player)都是在客户端实现的, 其中downloader负责把数据从远端server下载下来,并把下载下来的数据送给local streamer进行本地streaming, 然后local player连接到local streamer来得到需要播放的数据进行播放。通过下面的抓包分析可知,downloader是通过http协议来从远端server下载数据,local streamer也是通过提供本地http服务把播放数据提供给local player.
下面分析android平台上douyin下载数据并播放的过程。
0x2 下载
0x21 dns查询服务器的ip地址
通过dns查询v1-dy.ixiguavideo.com的ip地址,这一步是为后面的http连接服务的。
如下图所示,第49号包是发送dns查询请求,第56号包是返回dns查询结果。
dns查询结果如下,可以看到对应服务器的ip地址, 其中返回好几个ip地址,下面的http连接采用的是第一个ip地址。
0x22 http连接到服务器并下载数据
如下所示,通过http连接到服务器。
可以看到http url如下, 这个地址是经过加密的,直接在浏览器中去访问是连接不上去的。
http://v1-dy.ixiguavideo.com/9980b014844ac5185d899a1af1e41554/5acf7425/video/m/220fea4bc73a1c54023a9819c71b52a9b3e115640520000a8c154141acc/?device_platform=android&device_type=myandroid&version_code=179
然后可以看到客户端不停地从服务器上下载数据。
0x3 播放
下载过程中,启动本地http服务, 播放器通过访问这个http服务来得到播放数据,
前面三个包(1130, 1131, 1132)是三次握手的过程。
后面的包是发送给播放器的播放数据。
下面是douyin app中的lib,从其中可以看到其播放架构是基于ffmpeg实现的。通过分析可知,这里面有好几个库都包括了ffmpeg的代码,感觉模块之间划分不是很清楚,代码有冗余。
|
|
其中libeffect.so实现了对用户拍摄好的视频内容进行编辑,加特效等工作,如下所示,其中包括了CV相关的代码。