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

news2024/10/1 9:47:47

如何使用原生的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.coloradmin.cn/o/1979656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每天五分钟深度学习:向量化方式完成逻辑回归模型的参数更新

本文重点 上一节课程中,我们学习了m个样本的前向传播的向量化,我们可以同时完成m个样本的前向传播,也就是m个样本z的计算,然后a的计算。本节课程我们将学习dw和db参数更新的向量化,最终得到整个逻辑回归算法的参数更新的向量化表示。 非向量化的逻辑回归梯度下降算法 如…

学习日志8.4--DHCP攻击防范

目录 DHCP饿死攻击 DHCP Sever仿冒攻击 DHCP攻击防范 DHCP动态主机配置协议&#xff0c;是给主机提供自动获取IP地址等配置信息的服务。在主机对DHCP服务器发送DHCP Discover请求之后&#xff0c;服务器回复offer&#xff0c;主机再回复request&#xff0c;最后服务器回复AC…

uni-app开发打包成H5部署到服务器

1. 点击发行 2. 点击进入manifest.json的h5配置里&#xff0c;根据自己的情况配置一些信息。一定要注意配置 “运行的基础路径”&#xff0c;如果出现空白页面或者静态文件404的情况&#xff0c;可能是因为这个路径没有配置好。 3. 填写域名 4. 点击发行后&#xff0c;控制台后…

如何让左右两个div各占50%,并且高度相同?

如何设置两个div各占一半&#xff0c;并且高度随着内容增加&#xff0c;而且两边div的高度一致呢&#xff1f;默认会发现高度不一致&#xff0c;改用flex就可以了&#xff0c;另外发现传统的table也可以轻易实现。不知道不用flex的话是否可以实现。 方法1&#xff08;div实现&a…

二分+dp,CF 1993D - Med-imize

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 D - Med-imize 二、解题报告 1、思路分析 对于n < k的情况直接排序就行 对于n > k的情况 最终的序列长度一定是 (n - 1) % k 1 这个序列是原数组的一个子序列 对于该序列的第一个元素&#xff0…

Spring中使用Async进行异步功能开发实战-以大文件上传为例

目录 前言 一、场景再现 1、Event的同步机制 二、性能优化 1、异步支持配置 2、自定义处理线程池扩展 3、将线程池配置类绑定到异步方法 三、总结 前言 在之前的博客中&#xff0c;曾将讲了在SpringBoot中如何使用Event来进行大文件上传的解耦&#xff0c;原文地址&…

算法回忆录(2)

6.输入一个非递减排列的整数数组nums,和一个目标值target。请找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值target,则输出0&#xff0c;0。请设计一个时间复杂度为0(log n)的算法解决此问题。 输入包括两行&#xff0c;第一行输入两个整数&#xff0c…

【电路笔记】-偏置晶体管

偏置晶体管 文章目录 偏置晶体管1、概述2、共发射极晶体管偏置3、集极反馈偏置4、双反馈晶体管偏置5、发射极反馈配置6、分压器晶体管偏置晶体管偏置是将晶体管直流工作电压或电流条件设置为正确电平的过程,以便晶体管可以正确放大任何交流输入信号 1、概述 双极晶体管的稳态…

DBA | 炼气期,关系数据库及六大范式(NF)理论概述!

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 前言简述 描述&#xff1a;上一章&#xff0c;我们简单了解了关系类型数据库&#xff0c;以及其相关产品&#xff0c;此章节我们由浅入深的学习一下什么是关系型数据库&#xff0c;不过在讲解关系…

中国县城建设统计年鉴(2015-2022年)

数据年限&#xff1a;2015-2022年&#xff0c;年鉴时间即为数据时间 数据格式&#xff1a;pdfexcel 数据内容&#xff1a; 共分12个部分&#xff0c; 包括县城市政公用设施水平&#xff08;人口密度/人均日生活用水量/供水普及率/燃气普及率/人均道路面积/建成区路网密度/污水处…

51单片机—电动车报警器

一. 入门 1.1 开发环境的安装 用什么写代码--语言是C&#xff0c;环境是keilKeil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统&#xff0c;与汇编相比&#xff0c;C语言在功能上、结构性、可读性、可维护性上有明显的优势&#xff0c;因而易学易用。…

江协科技51单片机学习- p37 红外遥控(外部中断)

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

提供三方API接口、调用第三方接口API接口、模拟API接口(三)使用AOP切面编程实现signature签名验证

接着第一篇文章 提供三方API接口、调用第三方接口API接口、模拟API接口&#xff08;一&#xff09;通过signature签名验证&#xff0c;避免参数恶意修改 我们来继续优化&#xff1a; /*** 模拟后端校验签名* param request* param data* return* throws UnsupportedEncodingEx…

[环境配置]C4D OC渲染器解决缺少cudnn_8_0_4Octance正版缺少cudnn_8_0_4_win文件解决方法

关于Octance正版缺少cudnn_8_0_4_win文件解决方法 可在此处https://download.csdn.net/download/FL1623863129/89605383进行下载 放到对应文件位置即可 在计算机图形学领域&#xff0c;Cinema 4D&#xff08;C4D&#xff09;作为一款顶尖的专业3D建模、动画与渲染软件&#x…

学生管理系统之数据模拟与数据显示

学生管理系统之数据模拟与数据显示 设计一个单例 模拟数据 显示数据

CSP-J 2022 填程题19.解析

19. &#xff08;枚举因数&#xff09;从小到大打印正整数 n 的所有正因数。 试补全枚举程序。 01 #include <bits/stdc.h> 02 using namespace std; 03 04 int main() { 05 int n; 06 cin >> n; 07 08 vector<int> fac; 09 fac.reserve((int)ce…

【算法】动态规划---多态dp问题

多态dp问题 一.[leetcode] (打家劫舍I) 17.16.按摩师二. [leetcode] 213. 打家劫舍 II三.[leetcode] 740. 删除并获得点数四.[leetcode] LCR 091. 粉刷房子五.[leetcode] 309. 买卖股票的最佳时机含冷冻期六.[leetcode] 714. 买卖股票的最佳时机含手续费七.[leetcode] 123. 买卖…

职场,要想逆袭,必须要“装”

普通人&#xff0c;没有家庭背景&#xff0c;没有社会资源&#xff0c;没有好学历&#xff0c;如何才能逆袭呢&#xff1f;有朝一日自己熬出头&#xff0c;又如何避免被别人针对呢&#xff1f; 最重要的就是要会“装”。 在社会上&#xff0c;只有资源多的人才能更好的生存&a…

opencv c++ python等比缩小或放大显示图片代码

c代码&#xff0c;其中scale_percent用来设置百分比&#xff0c;例如50 就是百分之五十&#xff0c;也就是一半的大小&#xff0c;当然也可以设置成200&#xff0c;相当于原来的2倍大小&#xff0c;注意图片路径换成实际路径。 #include <opencv2/opencv.hpp>int main()…

【Java零基础视频教程】综合练习题(一)——基础练习

文章目录 基础练习飞机票打印素数生成验证码复制数组评委打分数字加密抽奖双色球 基础练习 飞机票 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 ​ 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&…