node.js - 使用 ffmpeg 和 nodejs 剪切视频而不重新编码( Fluent-ffmpeg )

标签 node.js ffmpeg fluent-ffmpeg

我有一个简单的问题, 我正在尝试做一个云视频编辑器,我希望能够使用nodejs剪切视频。

我正在使用fluent-ffmpeg 。这是我的代码:

const cutVideo = async (sourcePath, outputPath, startTime, duration) => {
  console.log('start cut video');

  await new Promise((resolve, reject) => {
    ffmpeg(sourcePath)
      .setFfmpegPath(pathToFfmpeg)
      .setFfprobePath(ffprobe.path)
      .output(outputPath)
      .setStartTime(startTime)
      .setDuration(duration)
      .on('end', function (err) {
        if (!err) {
          console.log('conversion Done');
          resolve();
        }
      })
      .on('error', function (err) {
        console.log('error: ', err);
        reject(err);
      })
      .run();
  });
};

它可以工作,但不是最佳的,当我尝试编辑一个长视频(从视频中获取 10 分钟而不是 1 分钟)时,它就变得超长。

我的理解是 ffmpeg 重新编码所有内容,所以这就是为什么编辑时间越长,过程就越长。 有没有办法在不重新编码所有内容的情况下停止使用node-fluent-ffmpeg?

感谢社区!

最佳答案

深入了解 Node Fluent 文档和来自 @szatmary 的信息后,可以定义音频和视频编解码器。要使用相同的编解码器并避免重新编码所有视频,只需将 copy 作为 withVideoCodecwithAudioCodec 中的参数传递即可:

const ffmpeg = require('fluent-ffmpeg');
const pathToFfmpeg = require('ffmpeg-static');
const ffprobe = require('ffprobe-static');

const cutVideo = async (sourcePath, outputPath, startTime, duration) => {
  console.log('start cut video');

  await new Promise((resolve, reject) => {
    ffmpeg(sourcePath)
      .setFfmpegPath(pathToFfmpeg)
      .setFfprobePath(ffprobe.path)
      .output(outputPath)
      .setStartTime(startTime)
      .setDuration(duration)
      .withVideoCodec('copy')
      .withAudioCodec('copy')
      .on('end', function (err) {
        if (!err) {
          console.log('conversion Done');
          resolve();
        }
      })
      .on('error', function (err) {
        console.log('error: ', err);
        reject(err);
      })
      .run();
  });
};

关于node.js - 使用 ffmpeg 和 nodejs 剪切视频而不重新编码( Fluent-ffmpeg ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63997589/

相关文章:

node.js - 使用 expressjs 处理异步 waterfall 中的错误

encoding - FFMPEG:无法在过滤器支持的格式之间进行转换 - 重新初始化过滤器时出错

android - 使用 ffmpeg 合并两个音频文件和一个视频文件并控制音量?

node.js - 我需要将音频和视频流与流利的ffmpeg结合起来

node.js - 在 Heroku 上运行时找不到模块 './mergeConfig'

node.js - mongodb schema.createIndex 不是一个函数

c++ - 由于库的包含语句,无法通过 GCC 编译使用库 (FFmpeg) 的 C 程序

ffmpeg - 如何在特定时间在特定时间向视频添加多个音频

javascript - 使用 fluent-ffmpeg 将 ffprobe 元数据返回到另一个函数

javascript - MongoDB (Node.js) 将数据返回到数组