前置知识
MP4是我们常见的视频格式,往往我们在播放服务器视频时直接就是请求的MP4视频源。但其实这样并不好,MP4头文件[ftyp+moov]较大,初始化的播放需要下载完整的头文件并进行解析,之后再下载一定长度的可播视频片段才能进行播放。另外随着视频尺寸的增大头文件也会不断变大,这个初始播放时间也会更长。针对这种情况需要一种能加快视频初始解析的方法,HLS就是苹果提出的用于解决这种问题的方案。
HLS为HTTP Live Streaming的缩写,是由苹果公司提出的基于HTTP的流媒体网络传输协议,它可以同时支持直播和点播,还支持多清晰度、音视频双轨、字幕等功能。它的原理是将一整条视频分成多段小的视频,完整的播放是由这一个个片段拼接而成的。
HLS在移动端使用很广泛,当前支持HLS协议的客户端有:
- iOS 3.0及以上,AVPlayer原生支持HLS
- Android 3.0及以上
- Adobe Flash Player 11.0及以上
它的大致原理是这样的:
1、采集音视频
2、在服务器编码音视频
3、编码后以MPEG-2的传输串流形式交由切片器(Stream Segmenter)
4、切片器创建索引文件和ts播放列表,索引文件用于指示音视频位置,ts为真实的多媒体片段
5、将上一步资源放到HTTP服务器上
6、客户端请求该索引文件进行播放,可以通过索引文件找到播放内
实现HLS的一个关键步骤是上面的第四步,即索引文件和ts播放列表的组织。这里用到的就是M3U8格式。M3U8是Unicode版本的M3U,8代表使用的是UTF-8编码,M3U和M3U8都是多媒体列表的文件格式。
M3U8文件的具体内容就不介绍了,这里只需知道它是视频的索引文件。
实操方法
手机的X浏览器支持嗅探视频的链接,mp4文件的话当然直接下载该文件就可以了,但是大多数情况嗅探出来的链接都是m3u8文件,手机的IDM支持解析m3u8文件,基于它去下载视频。
但是电脑的IDM没法解析m3u8文件。电脑也有一些插件支持嗅探出来链接,如Edge浏览器的FetchV。
它本身也支持对m3u8文件的解析,并基于它进行视频的下载,如下图:
-
但是这些浏览器上的插件都会有一个关键缺陷,它们都是使用浏览器的资源来工作的,这就导致它们直接把数据放到内存里面缓存!
如下图,下载几个G的视频,占用的内存也达到几个G了,这就很蛋疼了,一旦系统资源不够,选项卡随时就崩掉了。
-
而且,很多浏览器会有标签睡眠的功能,一旦一个选项卡太久没用就会进入睡眠状态,这个会释放该选项卡的部分内存。
如下面是对Edge浏览器的选项卡睡眠功能的介绍。
https://blogs.windows.com/msedgedev/2021/03/04/edge-89-performance/
https://techcommunity.microsoft.com/t5/articles/sleeping-tabs-faq/m-p/1705434
虽然选项卡睡眠功能只会释放部分内存,从而实现瞬间唤醒选项卡的效果,而不是关闭选项卡,关闭选项卡是所有内存都释放掉,唤醒时就得重新加载所有内容了。
但是,睡眠功能到底会不会错误地释放插件的视频缓存数据还是一个未确定的问题。
当然,也可以配置一下,针对这些插件的tab不睡眠,它本身也有一些策略来避免对某些tab进行睡眠。
因此,很有必要找到一个好用的m3u8解析工具!下面就是一个很好的开源工具N_m3u8DL:
https://github.com/nilaoda/N_m3u8DL-CLI
这个是使用文档
https://nilaoda.github.io/N_m3u8DL-CLI/
N_m3u8DL基于.NET Framework 4.6框架开发,调用系统类库进行HTTP下载。
依赖.NET Framework 4.6框架,但是貌似系统已经有了,就不用下载安装了,需要再从如下链接下载
https://dotnet.microsoft.com/download/thank-you/net46-chs
还需要ffmpeg,为了方便就下载这个文件,内置了ffmpeg,不用自己下载。
- CLI是命令行的版本,打开后直接输入m3u8链接即可触发下载。
- SimpleG是图形化版本,可以方便配置参数。
支持自定义下载线程的个数,前面的浏览器插件最大只支持4个线程,这里默认最小线程数就是16个了,不过可能部分站点会因为线程过多而将你的ip封禁。