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

news/2024/10/20 17:30:56/

如何使用原生的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.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'

http://www.ppmy.cn/news/1506124.html

相关文章

postgresql 双重排序后 重复项 标识次序

postgresql 双重排序后 重复项 标识次序 在PostgreSQL中&#xff0c;如果你想要在双重排序后标识重复项的次序&#xff0c;可以使用窗口函数&#xff08;window functions&#xff09;。一个常见的方法是使用ROW_NUMBER()窗口函数&#xff0c;它会为每个分组内的行分配一个唯一…

数据结构图书管理系统

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> //图书的结构体 struct bookInfo {char book_num[10];//编号char book_name[20];//书名char book_write[20];//作者float privce;//价格int num;//数量 }; //关…

谷粒商城实战笔记-151-缓存-缓存使用-本地缓存与分布式缓存

文章目录 一&#xff0c;本地缓存1&#xff0c;定义 2&#xff0c;优点3&#xff0c;代码示例&#xff08;Java&#xff09;4&#xff0c;缺点 二&#xff0c;分布式缓存1&#xff0c;定义2&#xff0c;优点3&#xff0c;缺点4&#xff0c;代码示例 三&#xff0c;本地缓存与分…

C语言 ——— 学习并使用字符分类函数

目录 学习isupper函数 学习isdigit函数 学习tolower函数 将输入的字符串中把大写字母转换为小写字母并输出 学习isupper函数 参数部分&#xff1a; 形参需要传递的是一个字母&#xff0c;字符在ASCII码表上是以整型存储的&#xff0c;所以实参部分用(int c)没有问题 返回…

Go 临界资源 安全问题

临界资源安全的问题&#xff1a; 临界资源&#xff1a; 指并发环境中多个 进程/线程/协程 可以共享&#xff08;都可以调用&#xff09;的资源/变量&#xff0c;如果在并发环境中处理不当&#xff0c;就会造成一些 严重、问题 func main() {//临界资源a : 10go func() {a 100f…

LLM金融文本分类文档说明

Python注意事项&#xff1a; 1&#xff0c;创建虚拟环境&#xff1a; conda create --prefixD:\software\Anaconda3\envs\finance_analysis python3.10.4 conda create -p D:/software/anaconda3/envs/finance_analysis python3.10.4 注释&#xff1a; D:\software\anaconda3\e…

redolog和binlog的两阶段提交和区别

redolog和binlog区别 redo log 是 InnoDB 引擎特有的&#xff1b;binlog 是 MySQL 的 Server 层实现的&#xff0c;所有引擎都可以使用。redo log 是物理日志&#xff0c;记录的是“在某个数据页上做了什么修改”&#xff1b;binlog 是逻辑日志&#xff0c;记录的是这个语句的…

<数据集>柑橘缺陷识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1290张 标注数量(xml文件个数)&#xff1a;1290 标注数量(txt文件个数)&#xff1a;1290 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Orange-Green-Black-Spot, Orange-Black-Spot, Orange-Canker, Orange…