如何使用原生的NodeJs下载视频网站上的视频资源到本地生成MP4文件
- 1、当下视频网站的视频资源无法通过常规手段下载的原因
- 2、什么是M3U8是什么视频文件?
- 3、如何下载M3U8文件中的TS文件并在本地合并为MP4文件?
-
- 3.1 FFmpeg 是什么工具?
- 3.2 安装 FFmpeg 工具
- 3.3 使用 FFmpeg 工具下载所有TS文件并合并为MP4文件
- 4、如何下载加密后的M3U8视频资源并在本地生成MP4文件?
-
- 4.1、安装 OpenSSL 工具
- 4.2、使用NodeJs一键下载、解密、合并M3U8中的视频资源到本地
-
- 4.2.1、 获取M3U8文件,并解析解析M3U8源文件中每一行内容,获取到所有的 ts 文件
- 4.2.2、 下载M3U8中所有的TS文件到本地
- 4.2.3、生成解密TS的脚本文件
- 4.2.4、生成解密后的M3U8文件
- 4.2.5、 将解密后的TS合并为MP4文件
- 4.3、完整代码
1、当下视频网站的视频资源无法通过常规手段下载的原因
通常情况下视频网站的视频是无法通过常规手段下载的,这是因为视频的资源地址被分片处理了,而最常用的是分片技术就是今天要说的M3U8
资源文件和TS
分片资源,其中的M3U8
中记录了所有的TS
分片的地址,而TS
分片地址就是视频资源中的一个小片段,通常一个TS
分片的视频片段大概是3秒
、5秒
、10秒
、12秒
等不同,是由开发人员在开发的时候定义的每个TS
分片的视频片段时长。
2、什么是M3U8是什么视频文件?
M3U8
是一种基于HTTP
的流媒体文件格式,用于描述多段音频和视频数据的URL地址,适合不需要实时传输的场景。M3U8
文件的特点在于灵活性和可扩展性,可以针对不同网络环境和设备进行优化,支持加密和加密后的播放,常被用于在线直播、视频点播、远程教育等领域。在手机上和电脑上都可以轻松播放M3U8
视频文件,随着网络技术的发展,M3U8
的应用将会越来越广泛。
如下图所示,在视频网站中经常会看到一个类似 http://www.example.com/index.m3u8
的请求地址,而这个地址中就包含了所有TS
分片的信息。
下图中是一个M3U8
文件中所包含的TS
分片的信息:
#EXTM3U
是必需的标记,表明文件是M3U8
格式。#EXT-X-VERSION
定义M3U8
文件的版本号。#EXT-X-TARGETDURATION
指定每个分段视频文件的最长时长,以秒为单位。#EXT-X-MEDIA-SEQUENCE
指定第一个分段视频文件的序列号,然后将每个分段视频文件的持续时间和URL
逐一列出。#EXTINF
指定当前TS
片段的时长。xxxxx.ts
是TS
的资源地址,一般是相对路径,可以自行拼接上对应的HTTP
地址,就可以将TS
文件下载下来。
3、如何下载M3U8文件中的TS文件并在本地合并为MP4文件?
在介绍如何下载M3U8
文件中的TS
并合并为MP4
文件之前,先了解一下接下来要用的视频合成工具 FFmpeg
。
3.1 FFmpeg 是什么工具?
FFmpeg
是一个功能强大的开源软件,主要用于视频和音频处理。它支持多种操作系统,包括Windows
、Linux
和macOS
等,提供了丰富的视频和音频编解码器,能够处理几乎所有的音视频格式。FFmpeg
的功能包括转码
、剪切
、拼接
、旋转
等,广泛应用于视频网站、商业软件以及个人用户。此外,FFmpeg
还支持多种音视频处理功能,如转码、编辑、解码、编码和流媒体传输等操作,是一个跨平台的开源软件,用于视频的编解码和格式转换。
3.2 安装 FFmpeg 工具
FFmpeg
1下载地址:https://ffmpeg.org/
按照安装程序中的指引逐步安装即可。
安装完成后,打开命令行窗口,输入如下命令,如果能正常打印出版本信息,即说明已安装成功了。
$ ffmpeg -version
3.3 使用 FFmpeg 工具下载所有TS文件并合并为MP4文件
$ ffmpeg -i index.m3u8 -c copy output.mp4
这就是普通的M3U8文件下载TS并在本地合成MP4的方法。
4、如何下载加密后的M3U8视频资源并在本地生成MP4文件?
上面已经介绍了,M3U8
是支持加密和加密后播放的,接下来就介绍一下对于加密的M3U8
视频资源如何下来所包含的TS
文件,并在本地合成MP4
的。
加密的M3U8
文件和非加密的M3U8
文件的区别在于关键字 #EXT-X-KEY
,这个关键字中定义了加密方式、加密所需要的密钥KEY
和偏移量IV
。如果不进行解密操作,即使把M3U8
中的TS
文件下载下来也无法播放和合并为MP4
文件。
METHOD
加密方式,解密也需要同样的方式才行。URI
密钥文件地址,记录了二进制密钥。IV
加密解密需要的偏移量,如果没有关键字IV
则偏移量默认是32个0
,注意关键字IV
把0x
字符移除得到的便是解密需要的偏移量,如上图中的偏移量为:07f64b3f577ab4b1a7a832aabe9d9e77
首先需要将 enc.key
密钥文件下载下来,然后需要通过HxD
2软件获取其中的二进制码。
下载安装HxD
之后,使用HxD
打开下载下来的 enc.key
文件。
复制出对应的二进制码,然后移除其中的空格得到的就是解密需要用到的密钥。
得到加密方式、密钥和偏移量后就可以对M3U8
中的TS
文件进行解密了。
将M3U8
中的TS
下载下来,而此时的TS
文件是加密的视频片段,是无法播放的,需要先解密才可以播放视频片段。
在解密之前,先查看本地电脑中是否已经安装 openssl
命令,如果没有,则先安装 openssl
工具。
4.1、安装 OpenSSL 工具
如果电脑中没有 openssl
工具可以先安装命令行工具,也可以使用 Git-Bash
3,它自带 openssl
。
安装完成后,使用 bash.sh
打开命令行窗口,并输入命令:
$ openssl version
4.2、使用NodeJs一键下载、解密、合并M3U8中的视频资源到本地
4.2.1、 获取M3U8文件,并解析解析M3U8源文件中每一行内容,获取到所有的 ts 文件
const fs = require('fs');
// 解析从网络下载下来的M3U8源文件内容
const m3u8_https_text = fs.readFileSync(path.resolve(__dirname, source_m3u8_filename), 'utf8');
// 过滤出M3U8源文件中所有的ts文件的链接地址
const m3u8_https_text_ts_path_list = m3u8_https_text.split('\r\n').filter(line => line.endsWith('.ts'));
4.2.2、 下载M3U8中所有的TS文件到本地
const https = require('https');
const path = require('path');
for (let i = 0; i < m3u8_https_text_ts_path_list.length; i++) {
const ts_file_path = m3u8_https_text_ts_path_list[i];
let ts_filename = ts_file_path.split('/').pop();
const options = {
hostname: 'www.example.com',
path: ts_file_path,
method: 'GET'