一、 概述
我之前测试过bilibili的直播(主播使用OBS-studio推送),延迟是相当低,大概就是3s-4s延迟,所以猜测网上说的直播客户端使用hls协议播放是不可能的。hls如果是按照5秒切片,那个最少保留3个ts的片段,理想情况不考虑网络的传输都需要15s左右,而且腾讯云直播官网提供数据是hls直播延迟35s左右。我想着这样直播客户端应该是使用rtmp协议来实现的,按照我的猜测,我是用wireshark来抓取包分析之后,发现虽然不是rtmp协议,使用的是http + flv视频容器这种方式。应该是为了http走80端口,方便nginx做负载均衡。虽然后端服务器我不太清楚B站是怎么处理的,我还是把我抓包结果记录出来,让正在做直播的同学参考一下。
二、 准备所需要的环境
1 抓包工具软件 Wireshark-win64-2.0.2.exe
2 电脑播放软件ffmpeg-20140323-Git-fc567ac-win64-shared.7z 主要使用ffplay播放器软件(命令行模式)
3 bilibili的手机客户端 4.14.0 播放器是ijkplayer ,在设置-》帮助-》开放源码许可 可以看到详细的使用相关的软件信息
4 就是360免费wifi 为了抓取手机上的包,最好的办法就是使用电脑作为wifi热点,手机连到该热点上,然后通过wireshark抓取该无线网卡的数据包
三、开始抓包
1 首先使用你电脑做为wifi热点,然后手机连接到该wifi热点上。这是必须的
2 打开bilibili的手机客户端,找到直播栏目
3 打开wireshark软件,选择你无线网卡,这里根据你个人电脑情况不同,你可能会看到多个无线网络连接,你自己一个一个试一下,看看是哪个手机发出的数据包?我的是(无线网络连接3 ) 效果如下:
选择无线网络连接3之后,就开始抓包了,这一步你可以根据你自己需要,当你点击播放直播的时候在开始抓包。
4 点击手机上的直播房间,如图:
然后观察wireshark中包分析,这里顺便说一下我之前以为是rtmp协议,所以在过滤的是 port 1935是看不到数据包的。所以我后来干脆没有使用过滤器,然后慢慢分析包的信息的,结果如下图:
5 上图可以看出,这是使用http + flv这种方式的,但是我还是不能确定,事情是不是这样的呢? 我接下来使用ffplay来播放测试该地址、播放命令如下:
直播路径仅供参考使用:http://60.207.246.38/live-play.acgvideo.com/live/398/live_5661153_2011833.flv?wsSecret=128828d624f2e70f9f17853a0dfea88c&wsTime=5752f544&wshc_tag=0&wsts_tag=577a7434&wsid_tag=76f758c1&wsiphost=ipdbm
播放结果如图:
可以看到虽然ffplay很简陋,但是还是直播了该内容,并且和手机是同步播放的。
四、结论
bilibili直播客户端,使用的播放器是ijkplayer,这个是B站开源的播放器,这里一万个赞。然后我测试结果证明了,直播客户端是使用http + flv的模式直播的,不是所谓和hls或者rtmp的。
via.http://blog.csdn.net/wk313753744/article/details/51824357