1. 环境与工具要求
保存视频需要依赖 ffmpeg 工具,下载地址 点击这里 , 各平台都有。
我的平台环境是 ubuntu20.04, 可以直接使用命令 sudo apt install ffmpeg
安装,先输入 ffmpeg -v 查看版本,如果没有安装,终端会提示安装命令,根据提示安装即可。
会用到的 npm 模块:
fluent-ffmpeg:
保存视频所依赖的插件, 必须。
single-line-log:
用来在终端同一行输出的插件,可选。
另外还会用到 fs
和 path
模块
2. 安装依赖模块
npm i fluent-ffmpeg single-line-log -S
3. 代码
核心代码单独写一个模块,新建 m3u8ToMp4.js
, 代码如下:
/**
* 功能: 下载 M3U8 地址的视频并保存成 MP4 格式
* 说明: 本模块修改自NPM模块 m3u8-to-mp4 , 原模块地址: https://www.npmjs.com/package/m3u8-to-mp4
*
*/
let ffmpeg = require("fluent-ffmpeg");
let log = require('single-line-log').stdout;
/**
* A class to convert M3U8 to MP4
* @class
*/
class m3u8ToMp4Converter {
/**
* Sets the input file
* @param {String} filename M3U8 file path. You can use remote URL
* @returns {Function}
*/
setInputFile(filename) {
if (!filename) throw new Error("您必须指定M3U8文件地址");
this.M3U8_FILE = filename;
return this;
}
/**
* Sets the output file
* @param {String} filename Output file path. Has to be local :)
* @returns {Function}
*/
setOutputFile(filename) {
if (!filename) throw new Error("您必须指定文件路径和名称");
this.OUTPUT_FILE = filename;
return this;
}
/**
* Starts the process
*/
start() {
return new Promise((resolve, reject) => {
if (!this.M3U8_FILE || !this.OUTPUT_FILE) {
reject(new Error("您必须指定输入和输出文件"));
return;
}
console.log('=========================');
ffmpeg(this.M3U8_FILE)
.on("error", error => {
reject(new Error(error));
})
.on('progress', function(progress) {
log('下载进度: 已完成 ' + (progress.percent).toFixed(2) + '%。');
})
.on("end", () => {
log('下载进度: 已完成 100%。\n');
console.log('=========================');
resolve();
})
.outputOptions("-c copy")
.outputOptions("-bsf:a aac_adtstoasc")
.output(this.OUTPUT_FILE)
.run();
});
}
}
module.exports = m3u8ToMp4Converter;
下载视频代码 ,新建 dlMovie.js
, 具体代码如下:
const fs = require("fs");
const path = require("path");
const m3u8ToMp4 = require("./m3u8ToMp4.js"); // 引入核心模块,注意路径
const converter = new m3u8ToMp4();
// 具体参数可自行修改
downloadMedia({});
function downloadMedia (opt, callback) {
// 测试视频,如果链接失效的话就自己找一个
let url = opt.url || "https://www.hkg.haokan333.com/201903/07/qM3F7ntN/800kb/hls/index.m3u8";
let output = opt.output || 'video';
let filename = opt.filename + '.mp4' || 'video.mp4';
let title = opt.title || '测试视频';
if (!fs.existsSync(output)) {
fs.mkdirSync(output, {
recursive: true,
});
}
(async function() {
try {
console.log("准备下载...");
await converter
.setInputFile(url)
.setOutputFile(path.join(output, filename))
.start();
console.log("下载完成!");
if ( typeof callback === 'function' ) callback();
} catch (error) {
throw new Error("哎呀,出错啦! 检查一下参数传对了没喔。", error);
}
})();
}
保存好js之后,终端输入 node dlMovie.js ,即可将 m3u8 链接中的视频合并保存成 mp4 格式视频。
Ps:
如果你是在mac下安装ffmpeg,推荐使用 homebrew 进行安装,但homebrew 的仓库源一定使用原始地址,不要使用国内的镜像地址,我在mac上安装时,被国内镜像地址坑了不少回。
网友评论