案例分享:如何使用原生的NodeJs下载视频网站上的视频资源到本地生成MP4文件

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.tsTS的资源地址,一般是相对路径,可以自行拼接上对应的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,注意关键字IV0x字符移除得到的便是解密需要的偏移量,如上图中的偏移量为: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'
    
  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值