美文网首页
使用 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