douyin streaming analysis

0x1 简介

抖音是最近火热的短视频app, 本文通过抓包来分析douyin的在线视频播放过程。
通过分析,可以知道其播放流程如下,
architecture
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

dns查询结果如下,可以看到对应服务器的ip地址, 其中返回好几个ip地址,下面的http连接采用的是第一个ip地址。
dns_result

0x22 http连接到服务器并下载数据

如下所示,通过http连接到服务器。
可以看到http url如下, 这个地址是经过加密的,直接在浏览器中去访问是连接不上去的。
http://v1-dy.ixiguavideo.com/9980b014844ac5185d899a1af1e41554/5acf7425/video/m/220fea4bc73a1c54023a9819c71b52a9b3e115640520000a8c154141acc/?device_platform=android&device_type=myandroid&version_code=179
http_connection

然后可以看到客户端不停地从服务器上下载数据。
http_download

0x3 播放

下载过程中,启动本地http服务, 播放器通过访问这个http服务来得到播放数据,
前面三个包(1130, 1131, 1132)是三次握手的过程。
后面的包是发送给播放器的播放数据。
http_playback

下面是douyin app中的lib,从其中可以看到其播放架构是基于ffmpeg实现的。通过分析可知,这里面有好几个库都包括了ffmpeg的代码,感觉模块之间划分不是很清楚,代码有冗余。

1
2
3
4
5
6
7
8
libaudiocore.so libdaemon.so libijkffmpeg.so libst_mobile.so libttnativecrash.so
libaudiofp.so libdys.so libijkplayer.so libstatic-webp.so libttvideouploader.so
libbdEASRAndroid.v1.5.6.so libeffect.so libijksdl.so libsupervisor.so libuserinfo.so
libbspatch.so libffmpeg.so libimagepipeline.so libtnet-3.1.11.so libweibosdkcore.so
libBugly.so libffmpeg-invoker.so liblivestream.so libtongdun.so libyuv.so
libcocklogic-1.1.3.so libffmpeg-main.so libmain.so libttEncrypt.so
libcrashlytics.so libgif.so libNailSLAM_jni.so libttmplayer.so
libcrashlytics-envelope.so libgifimage.so libSDL2.so libttmplayer_mc.so

其中libeffect.so实现了对用户拍摄好的视频内容进行编辑,加特效等工作,如下所示,其中包括了CV相关的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
00493ecd T cvGetImage
00494511 T cvGetImageCOI
0049439d T cvGetImageROI
00491261 T cvGetMat
0048fe41 T cvGetND
0053d33d T cvGetNumThreads
004ba981 T cvGetOptimalDFTSize
0041f609 T cvGetPerspectiveTransform
0048f4f5 T cvGetRawData
0048fea1 T cvGetReal1D
004900d9 T cvGetReal2D
00545685 T cvGetRootFileNode
00490321 T cvGetReal3D