这些协议真正要弄懂挺不容易,这里就记一下我能理解的部分。每部分的参考链接都放在最开头了。
HLS
https://blog.csdn.net/m0_60259116/article/details/124298016
服务器先把视频切片,切成.ts文件。
服务器把Media PlayList
发给客户端。Media PlayList
相当于索引,保存了.ts文件的位置。Media PlayList
就是m3u8文件。一个视频,有不同的m3u8,对应不同的分辨率和比特率(如720p,1080p)。
Master PlayList
保存了Media PlayList
的位置。Master PlayList
也是m3u8文件。
media playlist文件格式
样例:
#EXTM3U |
M3U8 文件的每行的内容只能是以下三种中的其中一种。
- URI
- 空行
- 以 # 开头的字符串
除了明确指定的元素之外不能有空格的存在。
以字符“#”开头的行要么是注释,要么是标签。标签以 #EXT 开头,大小写敏感。其他以“#”开头的行都是注释,客户端解析时应该忽略掉。
master playlist文件格式
样例
#EXTM3U |
下载视频
这个站开启了 F12自动debug,F12下无法操作页面。操作页面是为了让视频在F12打开状态下播放,方便抓到m3u8。
开启这个即可:
开启后,F5刷新,视频从头播放。
可以看到抓到了m3u8 ↑
有两个m3u8文件:
第一个:
第二个:
ts文件名有了,url在哪?看看两个m3u8文件的请求头。第一个m3u8保存第二个m3u8的位置,用的相对路径。第二个m3u8用的应该也是相对路径,所以ts文件放在:
https://cdn14.yzzy-tv-cdn.com/20230110/1013_f4def608/1000k/hls/989d9f248d9000000.ts
访问直接下载:
打开就是一个几秒的视频:
到时候写脚本批量下载,然后用ffmpeg
合并即可
MPEG-DASH
https://juejin.cn/post/7025202048765263886
https://blog.csdn.net/DeliaPu/article/details/79013812
https://blog.csdn.net/qq_31813549/article/details/100132269
DASH (Dynamic Adaptive Streaming over HTTP)
MPD文件
MPD (Media Presentation Description)。本质上是xml文件
<Period> |
Period
一个MPD文件可以有媒体时段。这些时段内容上可以相互独立。例如在正片中插入的广告内容,就相当于插入了一个Period。
Adaptation Set
自适应集合。一个自适应集合包含了一种媒体的多种可选版本,如一个视频的有不同分辨率、编码的版本,就可以放在一个Adaptation Set里。MPEG-DASH中的自适应切换就是根据网络环境在Adaptation Set里进行的切换,选择不同的Representation。
Representation
每个Representation包含了相同媒体内容的不同版本,即不同的分辨率、码率等,以供客户端根据自身的网络条件和性能限制来选择合适的版本下载播放。
Segment
媒体内容的切片,如音频视频切片。
切片可以切成两个文件(即不同URL),也可以一个文件切不同的字节范围Byte Range。
SegmentList
SegmentTemplate
SegmentBase
Representation只有1个Segment时用这个
说实话SegmentBase我不是很理解,List和Template都好理解。
一个完整的MPD文件:
下B站视频
参考上面链接里面的。
播放视频抓包没抓到MPD文件,看源码,有一个dash,是个json。这个json作用就相当于MPD文件,格式也是一样的。
video和audio都是列表(Adaptation Set),分别保存了不同版本的视频和音频(Representation):
video和audio是分别请求的,且按字节切片。如A.m4s表示视频,请求时带上请求头Range: 0-8000,表示只取这个量的字节,响应头Byte Range: 0-8000/15556122,告诉客户端,这次拿了哪部分字节,一共有多少字节,客户端再根据这个响应头确定下一次请求头。请求音频时也是一样的道理。
直接访问这个m4s,会提示403,需要带上原来的Referer请求头。不带Range请求头,默认传过来的就是完整视频。
只有一个视频是没声音的,还需要下音频文件,再用ffmepg合并起来。