You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js exec执行FFmpeg命令时反斜杠转义问题求解

Node.js exec执行FFmpeg命令时反斜杠转义问题的解决方案

问题核心

使用Node.js的exec执行FFmpeg命令时,drawtext参数中的\:无法正确传递:

  • 模板字符串中写\:,会被解析为:,导致FFmpeg命令失效
  • 写\\:,会被解析为\\:,同样不符合FFmpeg的要求
  • 直接在终端运行的命令正常,但Node.js的字符串转义逻辑会破坏命令格式

解决方法

1. 使用exec的数组参数形式(推荐)

exec支持传入数组形式的命令参数,这种方式会直接将参数传递给FFmpeg进程,跳过shell的转义解析,无需处理复杂的反斜杠转义。

示例代码:

const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);

const encode = async () => {
  try {
    const ffmpegArgs = [
      '-i', '/path/input.mp4',
      '-y',
      '-r', '25',
      '-ss', '0',
      '-to', '124',
      '-c:v', 'libx264',
      '-c:a', 'aac',
      '-vf', `scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,drawtext=text='timestamp \\: %{pts \\: localtime \\: 1665679092.241 \\: %m-%d-%Y %H\\\\:%M\\\\:%S}': x=(w-text_w-10): y=(h-text_h-5): fontsize=45: fontcolor=white@0.9: box=1: boxcolor=black@0.6: fontfile='/path/OpenSans-Regular.ttf'`,
      '/path/output.mp4'
    ];
    await execPromise('ffmpeg', ffmpegArgs);
    return 200;
  } catch (err) {
    console.error(err);
  }
};

说明:数组中每个元素对应FFmpeg的一个参数,drawtext里的\\:会被Node.js解析为单个\:,直接传递给FFmpeg,符合要求。

2. 调整字符串转义(适用于坚持使用字符串命令的场景)

如果必须用字符串形式传递命令,需要针对shell和Node.js的双重转义逻辑,将\:替换为\\\\:(模板字符串中):

示例代码:

const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);

const ffmnpegCode = `ffmpeg -i /path/input.mp4 -y -r 25 -ss 0 -to 124 -c:v libx264 -c:a aac -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,drawtext=text='timestamp \\\\: %{pts \\\\: localtime \\\\: 1665679092.241 \\\\: %m-%d-%Y %H\\\\\\\\:%M\\\\\\\\:%S}': x=(w-text_w-10): y=(h-text_h-5): fontsize=45: fontcolor=white@0.9: box=1: boxcolor=black@0.6: fontfile='/path/OpenSans-Regular.ttf'" /path/output.mp4`;

const encode = async () => {
  try {
    await execPromise(ffmnpegCode);
    return 200;
  } catch (err) {
    console.error(err);
  }
};

说明:模板字符串中的\\\\:会被解析为\\:,shell执行时会进一步将\\:转义为\:,最终符合FFmpeg的命令格式。

总结

优先选择数组参数的方式,它避免了shell转义带来的复杂性,代码可读性更高,也更不容易出错。

内容的提问来源于stack exchange,提问作者David Chavez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:15:44