node 下载保存M3U8 格式视频

文章介绍了如何利用Node.js的fluent-ffmpeg库和ffmpeg工具,通过编写m3u8ToMp4.js脚本,从M3U8格式的视频流中下载并转换为MP4文件。过程中涉及设置输入输出文件、监听下载进度和错误处理。示例代码在dlMovie.js中展示了一个具体的下载任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

node 下载保存M3U8 格式视频

应用到的技术

例如:

  • node v16.16.0
  • fluent-ffmpeg 2.1.2
  • single-line-log 1.1.2
  • ffmpeg-installer/ffmpeg 1.1.0

过程

  1. 安装依赖
npm i fluent-ffmpeg single-line-log @ffmpeg-installer/ffmpeg  -S

2.新建文件
m3u8ToMp4.js

/**
 * 功能: 下载 M3U8 地址的视频并保存成 MP4 格式
 * 说明: 本模块修改自NPM模块 m3u8-to-mp4 , 原模块地址: https://www.npmjs.com/package/m3u8-to-mp4
 *  
 */
const ffmpegPath = require('@ffmpeg-installer/ffmpeg').path;
const ffmpeg = require('fluent-ffmpeg');
ffmpeg.setFfmpegPath(ffmpegPath);
// 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('=========================');
		console.log(this.OUTPUT_FILE,'文件名')
      ffmpeg(this.M3U8_FILE)
        .on("error", error => {
          reject(new Error(error));
        })
        .on('progress', function(progress) {
			console.log(progress,'progress')
          console.log('下载进度: 已完成 ' + progress.timemark + '%。');
        })
        .on("end", () => {
          console.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('video');

function downloadMedia (opt, callback) {
  // 测试视频,如果链接失效的话就自己找一个
  let url = opt.url || "https://9.thehanju.com/file/taiju01/pics/2023/6/19/uQINGJ93/playlista.m3u8";
  let output = opt.output || 'video';
  let filename =   'video.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);
    }
  })(); 

}


3.运行命令 node dlMovie.js
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值