如何使用原生的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 工具
FFmpeg1下载地址: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 密钥文件下载下来,然后需要通过HxD2软件获取其中的二进制码。
 
 下载安装HxD之后,使用HxD打开下载下来的 enc.key 文件。
 
 复制出对应的二进制码,然后移除其中的空格得到的就是解密需要用到的密钥。
 得到加密方式、密钥和偏移量后就可以对M3U8中的TS文件进行解密了。
 将M3U8中的TS下载下来,而此时的TS文件是加密的视频片段,是无法播放的,需要先解密才可以播放视频片段。
 在解密之前,先查看本地电脑中是否已经安装 openssl 命令,如果没有,则先安装 openssl 工具。
4.1、安装 OpenSSL 工具
如果电脑中没有 openssl 工具可以先安装命令行工具,也可以使用 Git-Bash3,它自带 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'
    
                












![[环境配置]C4D OC渲染器解决缺少cudnn_8_0_4Octance正版缺少cudnn_8_0_4_win文件解决方法](https://i-blog.csdnimg.cn/direct/974a753149944d83ae320e5f6cc1d96a.png)





