美文网首页
使用 NodeJs 下载并保存 M3U8 格式视频

使用 NodeJs 下载并保存 M3U8 格式视频

作者: O无为学长O | 来源:发表于2021-03-01 00:40 被阅读0次

1. 环境与工具要求

保存视频需要依赖 ffmpeg 工具,下载地址 点击这里 , 各平台都有。
我的平台环境是 ubuntu20.04, 可以直接使用命令 sudo apt install ffmpeg 安装,先输入 ffmpeg -v 查看版本,如果没有安装,终端会提示安装命令,根据提示安装即可。

会用到的 npm 模块:
fluent-ffmpeg: 保存视频所依赖的插件, 必须。
single-line-log: 用来在终端同一行输出的插件,可选。
另外还会用到 fspath 模块

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上安装时,被国内镜像地址坑了不少回。

相关文章

网友评论

      本文标题:使用 NodeJs 下载并保存 M3U8 格式视频

      本文链接:https://www.haomeiwen.com/subject/uvmafltx.html