浏览器地址栏输入服务器端视频的url即可播放。刚开始觉得还有点神奇,追踪network请求,发现视频还没下载完就可以播放,还可以拖动进度条到指定时间。分析了一下网络请求和视频格式,得出些许领悟。
1.服务器端支持文件的分块传输。即浏览器请求指定位置的数据,这个位置指的是文件内容的位置,不是视频帧在文件中的位置。服务器不用管几分几秒的视频帧在文件的哪个地方。
2.浏览器端读取视频文件的头部的部分数据,分析视频信息,读取不同时间的视频帧对应在文件位置,mp4中格式的Time To Sample Box(stts)
3.默认从头开始播放,如果存在stts,也可以拖动进度条播放,
4.浏览器播放完一段视频后,或者播放过程中,下载紧接着当前时间的后的数据。
判断服务器是否支持分块传输
curl -i --range 0-10 http://www.sample.com/commonweb/a.txt
HTTP/1.1 206 Partial Content
Server: nginx/1.12.2
Date: Wed, 15 May 2019 11:59:41 GMT
Content-Type: text/plain
Content-Length: 11
Last-Modified: Wed, 15 May 2019 11:49:34 GMT
Connection: keep-alive
ETag: "5cdbfcce-25"
Content-Range: bytes 0-10/37
abcdefghijk
如果服务器返回11个字节的内容,即支持分块传输,前提是url对应的文件存在,并且内容大于10个字节
也可以用其他方式发起网络请求,http status一般是200、204、206
如上使用postman模拟分块请求文件,文件里面有37个字符,只获取10个,注意使用get请求,post请求可能返回405,not allow
mp4视频格式研究
https://www.cnblogs.com/ranson7zop/p/7889272.html
分块传输,加上视频时间轴的支持,只要能解析视频帧即可播放视频,