HLS直播草稿1
之前在zaiko上买了D+的live直播
一方面是想看おもいでしりとり,一方面是准备研究一下相关的东西。
(有时候觉得年纪也不小了,天天折腾这些东西为了什么。本身是能在摸索的过程中找到快乐的,但是又感觉没什么意义。有些东西确实身边会有一些比较专业的人士,其实直接问就可能可以获得最终的解决方案,但是我一个偏执自闭人怎么可能就这么开口呢)神经病))
提前说明一下,这个直播流上没有任何加密(todo: 有机会的话,针对加密的流进行测试)
进入直播页面,在开发者工具-网络中可以看到明显在不断加载的东西
先是加载m3u8文件,随后会加载一些xxx.ts的视频片段。
edge直接打开xxx.ts无法播放,可能是默认视频编码不支持?

m3u8文件说明
index.m3u8的内容如下
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=2312609,AVERAGE-BANDWIDTH=1790762,RESOLUTION=852x480,FRAME-RATE=30.000,CODECS="avc1.64001F,mp4a.40.2"
index_1.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=992635,AVERAGE-BANDWIDTH=800797,RESOLUTION=640x360,FRAME-RATE=30.000,CODECS="avc1.64001E,mp4a.40.2"
index_2.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=4568960,AVERAGE-BANDWIDTH=3511200,RESOLUTION=1280x720,FRAME-RATE=30.000,CODECS="avc1.64001F,mp4a.40.2"
index_3.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=7502290,AVERAGE-BANDWIDTH=5711200,RESOLUTION=1920x1080,FRAME-RATE=30.000,CODECS="avc1.640028,mp4a.40.2"
index_4.m3u8
搜索m3u8的文件说明可以看出,这个文件下描述了多个流的信息(二级m3u8文件)。
例如index_1.m3u8,对应分辨率852x480,帧率30.0,带宽,平均带宽(码率参考)
我们选择质量最高的index_4.m3u8,其内容如下
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:3
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PROGRAM-DATE-TIME:2021-06-25T09:45:12.640Z
#EXTINF:3.000,
index_4_0.ts
#EXT-X-PROGRAM-DATE-TIME:2021-06-25T09:45:15.640Z
#EXTINF:3.000,
index_4_1.ts
#EXT-X-PROGRAM-DATE-TIME:2021-06-25T09:45:18.640Z
#EXTINF:3.000,
index_4_2.ts
........
#EXT-X-PROGRAM-DATE-TIME:2021-06-25T11:16:33.640Z
#EXTINF:3.000,
index_4_1827.ts
#EXT-X-ENDLIST
\#EXTINF:指定每个媒体段(ts文件)的持续时间
xxxx.ts: 指定媒体文件的相对路径
EXT-X-ENDLIST 表明M3U8文件的结束。live m3u8没有此tag。
网页播放器默认的视频质量是auto,可以看到,它可能会根据一定策略,加载不同码率的片段。
(todo: 这次直播的时候我没太注意m3u8会是怎么描述,后续如何跟上?还是默认会以这样的命名规则进行加载?)
获取源视频
获取到直播/录播的m3u8文件后。原理就是根据文件信息,将所有的视频片段拼接起来
可以使用ffmpeg命令,minyami,播放器,或者自己手撸
ffmpeg
使用该命令可以对录像进行保存
ffmpeg.exe -i https://xxxxx.cloudfront.net/xxxxx/index.m3u8 -c copy -bsf:a aac_adtstoasc index.mp4
注意输入的是顶级m3u8文件url,然后会存下来某种码率的?
输入二级m3u8 url时,则会报错了,没法保存。(todo: 过段时间在测试)
于是去试了一下minyami(真好用)
它有本地node版与chrome插件。插件版支持的直播网站有限(还没真正用过)。
node相关安装内容参考github说明
使用该命令则可以对录像进行保存(注意输入的是二级m3u8文件)
minyami -d https://xxxxx.cloudfront.net/xxxxx/index_4.m3u8 --threads 12 --output xxx.ts
具体参数参考帮助信息,提供多线程下载可以直接设置线程数量。
输入顶级m3u8文件时,得到的是全部二级m3u8的文件合并出来的结果。
potplayer-打开-打开链接
将 https://xxxxx.cloudfront.net/xxxxx/index_4.m3u8 进去即可播放
播放器本身也提供录制功能,没有回放存档的时候,用这个可能比较简单。(记得提前设置好录制信息)
直播时录制
上一节主要是在有录播存档的情况下测试的。
对于只有直播的情况下,能够尽可能不丢包,保留原始ts的录制非常有必要。
(经常直播时提供大码率版,而录播存档只有较小码率版的)
todo: 直播录制最佳实践
关于此次ts文件的剪切
一开始使用以往几乎通用的两种方法(基于关键帧的分割?,重编码。参考之前的ffmpeg剪辑记录),都存在问题
然后发现时重编码时,需要把将-ss参数放在-i后,即可。这样似乎能得到最精确的定位,但是一开始会非常慢。[参考链接3]
(todo:这两种之间的区别,导致这样的原因。(其实这个我似乎没什么兴趣去搞明白。要是真搞明白了,可能准备把2年前写的那个改一改)
参考链接
M3U8流视频数据爬虫详解一:M3U8视频文件详解_wobushisongkeke的博客-CSDN博客_m3u8文件
Last-Order/Minyami: A lovely video downloader for HLS videos (github.com)