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

devtools/2024/10/18 18:26:53/

如何使用原生的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/devtools/91248.html

相关文章

solidity 数学和密码学函数

数学和密码学函数为开发者提供了一系列强大的工具&#xff0c;用于执行各种数学运算和加密操作 addmod(uint x, uint y, uint k) returns (uint) 计算 (x y) % k&#xff0c;加法会在任意精度下执行&#xff0c;并且加法的结果即使超过 2**256 也不会被截取。 从 0.5.0 版本…

笔面试编程题总结

8/6诺瓦星云 修改程序 void point(int *p){*p p[2];}; int main() {int c[] {1,2,3,4,5},*p c;point(p1);for(;p <c5;){printf("%d",*p);}return 0; }1、分隔字符串 strtok //c语言 #include <stdio.h> #include <string.h>// 函数声明 char* fin…

创建目录命令(mkdir) 学会啦

通过mkdir命令可以创建新的目录&#xff08;文件夹&#xff09; mkdir来自英文&#xff1a; Make Directory 语法&#xff1a; mkdir [-p] Linux路径 参数必填&#xff0c;表示Linux路径&#xff0c;既要创建的文件夹的路径&#xff0c;相对路径或绝对路径均可 wendywendyde…

不仅能防沉迷游戏的防沉迷软件(Python)

介绍 一个有那么一点功能但是又不太保险的防沉迷工具 我脑子进水了才会写这玩意儿 为了变强&#xff0c;我不择手段&#xff08;笑出zhu jiao 代码 好像没什么用的设定界面 # -*- coding: utf-8 -*- # Environment PyCharm # File_name login |User Pfolg # 2024/…

2024年【上海市安全员B证】模拟考试及上海市安全员B证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员B证模拟考试参考答案及上海市安全员B证考试试题解析是安全生产模拟考试一点通题库老师及上海市安全员B证操作证已考过的学员汇总&#xff0c;相对有效帮助上海市安全员B证证考试学员顺利通过考试。 1、【…

加速构建:在PyCharm中提升项目构建速度的秘诀

加速构建&#xff1a;在PyCharm中提升项目构建速度的秘诀 PyCharm作为Python开发者的首选IDE之一&#xff0c;提供了强大的功能来简化开发流程。然而&#xff0c;随着项目规模的扩大&#xff0c;构建项目可能会变得缓慢&#xff0c;影响开发效率。本文将深入探讨在PyCharm中解…

Golang | Leetcode Golang题解之第328题奇偶链表

题目&#xff1a; 题解&#xff1a; func oddEvenList(head *ListNode) *ListNode {if head nil {return head}evenHead : head.Nextodd : headeven : evenHeadfor even ! nil && even.Next ! nil {odd.Next even.Nextodd odd.Nexteven.Next odd.Nexteven even.N…

K8S Operator

K8S Operator是Kubernetes中用于管理自定义资源的一种特殊控制器&#xff0c;它扩展了Kubernetes API的功能&#xff0c;允许用户以声明式的方式创建、配置和管理复杂应用的实例。 一、定义与功能 定义&#xff1a;K8S Operator是一种基于Kubernetes自定义资源&#xff08;CR…