node 下载保存M3U8 格式视频

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
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\],m3u8是一种存放视频列表的格式,而不是视频文件本身。在代码中,可以看到通过遍历视频列表,将每个视频的URL添加到idArr数组中,并使用TcPlayer库将每个视频的URL与对应的DOM元素绑定起来,实现视频的播放功能。 根据引用\[2\],M3U8文件是一种UTF-8编码格式的M3U文件,它记录了一个索引,而不是直接包含视频文件。播放软件根据M3U8文件的索引找到对应的音视频文件的网络地址进行在线播放。因此,M3U8文件存放的是播放列表,而视频文件以另一种格式存储。 根据引用\[3\],在解决跨域问题时,可以尝试使用videojs这个开源库,并添加一层皮肤。然而,根据作者的经验,安装和卸载video.js和videojs-contrib-hls两个包时会出现问题。有人认为这是由于videojs版本的问题,也有人认为是由于node.js内部自带了video.js而导致冲突。然而,作者尝试了多种解决方法,但都没有成功。 综上所述,m3u8是一种存放视频列表的格式,而不是视频文件本身。要实现m3u8格式视频播放,可以使用TcPlayer库将视频URL与对应的DOM元素绑定起来。在解决跨域问题时,可以尝试使用videojs库,并注意可能出现的版本冲突问题。 #### 引用[.reference_title] - *1* *2* *3* [第一次在Vue项目中播放m3u8格式视频遇到的问题和解决方法](https://blog.csdn.net/jutgj/article/details/114662043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值