簡體   English   中英

如何使用 fluent-ffmpeg 執行自定義 ffmpeg 字符串命令

[英]How can I execute a custom ffmpeg string command with fluent-ffmpeg

如何將自定義命令傳遞給 fluent-ffmpeg( https://www.npmjs.com/package/fluent-ffmpeg/v/1.7.0 )? 我只想傳遞命令字符串。 就像是

var command = FFmpeg("ffmpeg -i input.mp4 -i input.mp3 -c copy -map 0:v:0 -map 1:a:0 output.mp4")

我已經看過提供的示例,但似乎需要 ffmpeg 知識來了解什么是文件管理器、編解碼器等......

不幸的是,在編寫這個 Fluent-ffmpeg 時仍然不支持自定義復雜的 FFMPEG 屬性,所以唯一的解決方案是分叉它或訴諸丑陋的“黑客”,這會破壞這個庫的主要目的(在大多數情況下)。

我將 Fluent-ffmpeg 與此“hack”一起用作處理多個復雜 FFMPEG 進程的簡潔包裝器,並具有良好的輸出/錯誤/進度解析。

const fluent = require('fluent-ffmpeg');

const executeFfmpeg = args => {
    let command = fluent().output(' '); // pass "Invalid output" validation
    command._outputs[0].isFile = false; // disable adding "-y" argument
    command._outputs[0].target = ""; // bypass "Unable to find a suitable output format for ' '"
    command._global.get = () => { // append custom arguments
        return typeof args === "string" ? args.split(' ') : args;
    };
    return command;
};

executeFfmpeg('-i input.mp4 -i input.mp3 -c copy -map 0:v:0 -map 1:a:0 output.mp4')
    .on('start', commandLine => console.log('start', commandLine))
    .on('codecData', codecData => console.log('codecData', codecData))
    .on('error', error => console.log('error', error))
    .on('stderr', stderr => console.log('stderr', stderr))
    .run();

注意:此解決方案不支持 'progress' 事件,但您可以通過使用 fluent-ffmpeg/lib/options.js 中的 extractProgress 方法解析 'stderr' 事件來輕松實現

下面的代碼是你需要的:

const ffmpeg = require('child_process').exec

ffmpeg("ffmpeg -i input.mp4 -i input.mp3 -c copy -map 0:v:0 -map 1:a:0 output.mp4")

您只需要將其傳遞給 outputOptions 方法。

const ffmpeg = require('fluent-ffmpeg');

ffmpeg()
  .input('input.mp4')
  .input('input.mp3')
  .outputOptions('-c copy -map 0:v:0 -map 1:a:0')
  .save('output.mp4');

Dušan Brejka 的回答對我有用。

fluent-ffmeg 使用 parseProgressLine 在https://github.com/fluent-ffmpeg/node-fluent-ffmpeg/blob/12667091eeea09b0d6a55b87eb886aa131178608/lib/utils.js#L20處理進度

這是我對解析進度的看法。 它還負責解析數值。

    function handleProgress(progressLine: string): Record<string, string | number> {
      // Remove all spaces after = and trim.
      // each progress part is a key-value pai. ex: "frame=123", "time=01:23:45.67"
      const progressParts: string[] = progressLine
        .replace(/=\s+/g, "=")
        .trim()
        .split(" ");
    
      // build progress object
      const progress: Record<string, string | number> = {};
      for (const keyValuePair of progressParts) {
        const [key, value] = keyValuePair.split("=", 2);
        if (typeof value === "undefined") return null;
        const valueAsNumber = +value;
        progress[key] = !Number.isNaN(valueAsNumber) ? valueAsNumber : value;
      }
    
      // do something with progress object
      console.log(progress);
      return progress;
    }

與:

    executeFfmpeg(cmd)
      // attach handles
      .on("stderr", handleProgress)
      .run()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM