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
相关产品推荐
相关产品推荐

