相关推荐
M3U8 格式与基于 Node.js 开发 M3U8 在线视频批量下载工具
2024-11-10 21:48

M3U8 格式与基于 Node.js 开发 M3U8 在线视频批量下载工具

M3U8 格式文件是一个纯文本文件,它是 HLS 协议规范的一部分,遵循 HLS 协议定义的在线多媒体播放列表(Playlist)规范。

HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输。HLS 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。HLS 协议由三部分组成:HTTP、M3U8、TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS 是音视频的媒体信息。

以下为一个 m3u8 格式文件内容的示例:


在以上示例中包含了 m3u8 文件常见的字段。下面为一个M3U8文件可包含的基本字段及含义解释:

  • M3U8文件头,必须在第一行。
  • 指定 M3U8 版本号。
  • 若 视频片段进行了加密,则需配置该字段指定加密解析方式。例如在上面的示例中,该字段指定了加密算法为 ,密钥通过请求 获取,以用于解密后续下载的 文件。
  • 第一个TS分片的序列号。对于视频点播资源该字段一般是 0,但是在直播场景下,这个序列号标识直播段的起始位置。
  • 每个分片TS的最大的时长,单位为秒。
  • 是否允许 cache,#EXT-X-ALLOW-CACHE:YES 、#EXT-X-ALLOW-CACHE:NO,默认情况下是YES。
  • 指定下一行的TS信息,如时长,带宽等。一般格式为 , 后面可以继续跟其他的信息,逗号之前是当前分片的TS时长。分片时长要小于 定义的值。
  • 该标签表明其前一个切片与下一个切片之间存在中断。
  • 指定流媒体类型。
  • M3U8 文件结束符。

HLS 协议编码格式的基本要求主要包括:

  • 视频编码格式为 。
  • 音频编码格式为 、 或 。
  • 音视频采用 或 格式,可包含多个多个视频片段。常见的主流方案多为 格式。
  • 以 为后缀的播放列表文件,指定 文件索引等信息。

做多码率的适配。HLS有一个特点:自适应码率流播(adaptive streaming)。M3U8 文件是一个纯文本的播放列表,其可配置多个不同码率的子 M3U8 文件入口地址。客户端可以根据网络状况自动选择不同码率的视频流,条件允许的情况下使用高码率,网络繁忙的时候使用低码率,并且自动在二者间随意切换。这对于流量敏感(流量付费)及网络状况较差的场景非常有利。

降低源服务器负载压力。M3U8的特点是将流媒体切分为若干 TS 片段,然后通过一个扩展的 m3u 列表文件将这些 TS 片段集中起来供客户端播放器接收。一旦切分完成,之后的分发过程完全不需要额外使用任何专门软件,普通的网络服务器即可,大大降低了 CDN 边缘服务器的配置要求,可以使用任何现成的CDN。分发使用的协议是最常见 HTTP,代理服务器对这个协议的缓存优化相当成熟,而很少有代理服务器对 RTSP 的进行缓存优化。

对于非实时视频,好处同样存在:播放使用HTTP协议的单个 MP4 格式的视频文件时,需要代理服务器支持 HTTP range request 以获取大文件中的一部分,但不是所有的代理服务器都对此有良好的支持。而 M3U 则只需要根据列表文件中的时间轴找出对应的 TS 片段下载即可,不需要 range request,对代理服务器的要求小很多。所有代理服务器都支持小文件的高效缓存。

为什么用 TS 而不是 MP4 格式。这是因为两个 TS 片段可以无缝拼接,播放器能连续播放,而 MP4 文件由于编码方式的原因,两段 MP4 不能无缝拼接,播放器连续播放两个 MP4 文件会出现破音和画面间断,影响用户体验。

文件本质上是一个纯本文文件的播放列表,需要先以 http 协议从服务器上下载,因此我们可以从浏览器的网络请求列表中将它过滤出来。

在视频播放的页面,按 F12 打开浏览器开发者工具调试控制台,切换到网络(network)选项卡,然后在过滤框输入 关键字对请求资源进行过滤。接着刷新页面并播放视频,让页面资源重新请求,此时即可在过滤面板下看到该视频资源请求的 m3u8 的地址。参考如下图示例:

常规的 m3u8 资源基本是以静态的 http 服务提供的,这让资源容易被盗用、被工具直接下载。为了对资源进行保护,常见 m3u8 的视频资源基本都会实现加密方案。

但对于如腾旭视频、优酷等大型的视频网站,为了避免收费视频资源被盗用播放、下载导出,其往往会生成时效非常短的 token 附加在 m3u8 地址、ts 分片地址等上面,作为服务器鉴权的依据。这种方案对于防盗链下载非常有效。

但是视频只要可以被播放,就避免不了泄露。最简单原始的方案,就是利用屏幕录像软件进行翻拍。但翻拍的缺点是其得到的内容无法于原始高清的视频相比。

当前各视频网站的无插件播放技术,基本都是基于 Media Source Extensions API 实现的。所以一种技术方案是利用浏览器的 对象接口,实现对网页媒体播放数据流的拦截,进而实现数据流拼接、转换和下载。浏览器油猴插件脚本 media-source-extract 即是该方案的一种实现。

影视资源采集站的目的是让其带有广告水印的视频尽可能广泛的分发传播,一般不会有任何的加密保护措施。

在没有 HLS 协议支持的时代,基于流媒体的在线视频点播多采用 RTMP 协议和 Flash 服务等需 Native 插件支持的方案。

而在当前 Flash 早已被废弃,HLS 协议取而代之被广泛的应用于视频点播和直播领域。现在互联网上几乎所有的直播平台和在线视频播放网站,都是基于 HLS 协议实现的在线媒体视频播放功能。如腾讯视频、优酷、爱奇艺、广电电视台点播与直播,以及提供在线观看服务的各种电影网站等等。

由于 HLS 协议规范以 或 音视频片段方式将完整的视频进行了分片,使得对视频进行快进、随意切换进度都非常简单,只需要根据 配置的索引信息进行简单的定位计算即可实现。

支持 HLS 协议解析的媒体播放器,均可直接播放 格式的视频资源。在主流浏览器上(支持 Media Source Extensions API),基于 web 标准 API 即可以实现对 HLS 协议的支持,无需任何 Native 的播放器插件即可实现对 格式文件的解析与视频播放。当前在浏览器上基于 HLS 的在线视频播放技术,基本都会采用开源库 hls.js 实现在线视频直播或点播方案。

以下为一个基于 实现在线视频播放的 页面示例:


可以看到,基于 实现对 m3u8 资源的在线播放非常简单。m3u8-player是一个较为完整的实现,可以支持对 m3u8 文件的播放,也可以支持直接复制 m3u8 文件的内容进行在线播放。

  • M3U8 在线播放器 https://lzw.me/x/m3u8-player/
  • M3U8 在线提取与下载
  • @lzwme/m3u8-dl 一个 M3U8 批量下载工具

当前各主流视频网站都提供了会员服务,对于热门的电影、电视剧和综艺等节目,基本都需要会员付费购买,或者观看大量漫长到令人难以忍受的广告。开一个视频网站付费会员是大多数人都可以接受的,但问题是一些热门剧往往被一个平台买断版权,只是为了看单个剧集而需再多开一个会员,还是会令人三思一下。

从上一篇文章《免费电影网站建设的模式与技术内幕》介绍的内容中,我们知道了免费电影站的影音视频资源来源实际上来源于资源采集站,但是由于使用它们服务的免费电影网站及免费影视观看软件很多,使得在高峰时期下载速度往往非常慢,观影卡顿是最明显的感受,也是比较难以忍受的,这使得免费电影站的视频播放存在较高的不稳定性,观影体验并不好。如果能够预下载下来,就解决了这个最为主要的问题。

实际上,我们可以直接从采集站搜索并获取想要观看的电影的 m3u8(M3U8 格式与在线视频播放播简介) 链接,然后基于 m3u8 链接对 ts 分片视频进行下载,最后再合并为完整的 mp4 格式视频文件即可完成视频下载。

上述内容来源于2023年春节期间个人追看热门剧《狂飙》的总结。在追剧的过程中开发了一个 M3U8 视频下载工具 @lzwme/m3u8-dl,它是一个基于 Node.js 开发的支持多线程并发批量下载 M3U8 视频的命令行工具,其最基本的功能是可以根据给定的一个或多个 M3U8 链接进行多线程的并发下载,然后转换为 mp4 格式(需 ffmpeg 支持),同时也支持 API 方式调用。

后面又继续丰富了功能,可以支持指定影视资源采集站 API 接口,从其接口搜索想要观看的内容,并提取 M3U8 视频地址进行下载,也基于 HLS 流媒体协议的特点支持了边下边看模式。

其实现原理其实是比较简单的,大致内容包括:

  • 首先将给定的 m3u8 地址进行下载,得到 m3u8 文件文本内容。
  • 然后借助开源库 m3u8-parser进行解析,可以得到其所有分片信息。
  • 基于 http 方式实现对分片 ts 文件的下载。
  • 基于 Node.js 的 模块实现对分片 ts 文件的多线程并发下载。若存在加密信息,还需使用 AES 等算法进行 ts 文件解密。然后缓存下载的 ts 文件至本地。
  • 根据 ts 分片信息的数量、时长等数据,实现对下载信息的进度计算逻辑。
  • 全部 ts 分片文件都下载完成后,借助 实现将它们合成一个 mp4 格式的完整视频文件。
  • 如果启动了边下边看模式,在下载到一定比例数量的 ts 分片文件后,即启动一个内置 web server,基于 库实现基于浏览器的边看边下支持。

若有兴趣,可详细阅读其源码实现进行进一步的了解:

  • github.com/lzwme/m3u8-…

首先需要安装 Node.js,可从官方网站下载并安装:nodejs.org/zh-cn

然后(windows 系统为例)打开 powershell 或 cmd 命令提示符等终端,执行如下命令进行全局安装:


继续执行 和 命令查看使用帮助,可以得到如下内容:


2.3.1 根据给定的 m3u8 链接进行下载

最简单的使用方法,给定一个 m3u8 视频地址,即可进行资源下载:


也支持指定剧集的多个地址进行批量下载:


还可以支持指定一个文本文件,对多个 m3u8 地址进行批量下载。新建文件 ,内容格式参考:


然后执行如下命令即可启动批量下载:


2.3.2 基于 API 的调用

导出了方法 等以供自编程应用程序调用。示例:


2.3.3 根据给定的资源采集站 API 搜索并下载

执行如下命令,然后按提示步骤继续操作即可(示例中的 API 地址为示例地址,并非真实可用的资源采集站API


    以上就是本篇文章【M3U8 格式与基于 Node.js 开发 M3U8 在线视频批量下载工具】的全部内容了,欢迎阅览 ! 文章地址:http://fhzcwj.xhstdz.com/quote/67426.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://fhzcwj.xhstdz.com/mobile/ , 查看更多   
发表评论
0评