2

我正在编写一个节点脚本,它使用复制和重新标记我的一些 MP4 文件fluent-ffmpeg

它不适用于任何包含空格的元数据。进行复制/标记的代码如下所示:

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

const inputFilename = 'path/to/original.m4a';
const outputFilename = 'path/to/new.m4a';

const options = [
    '-metadata', 'artist=Someone',
    '-metadata', 'album=Some title',
    // ...etc
];

ffmpeg(inputFilename)
  .outputOptions(options)
  .saveToFile(outputFilename);

这会导致错误:

events.js:183
      throw er; // Unhandled 'error' event

An error occurred: ffmpeg exited with code 1: title: Invalid argument

我试过Some title加单引号、双引号和不加引号。我试过逃避其中的空间。我尝试将选项数组作为单个选项而不是元组传递,例如:'-metadata album="Some title"'- 但无论我尝试什么,当有空格时它仍然会引发错误。

(可能需要注意这是在 Windows 上)

任何人都可以建议一种让它工作的方法吗?

4

2 回答 2

2

我解决了!(或者至少,我找到了一种解决方法 - 我相信问题是由 中的错误引起的fluent-ffmpeg

只需在包含空格的选项末尾添加一个额外的空格。所以,这一行:

'-metadata', 'album=Some title',

变成这样:

'-metadata', 'album=Some title ',

似乎终端空间在传递给时被忽略ffmpeg,即它没有出现在生成的文件的元数据中。

于 2018-03-07T08:05:33.473 回答
0

我注意到一个类似的问题,但不是在 Windows 上,只有在 Linux 上。我通过 Lazarus/FPC GUI 发送命令行。我以这种方式引用 titre.Text 中的空格:

如果 changemeta.Checked 则 chmeta := '-metadata title=' + quote + titre.Text + quote + ' -metadata:s:v:0 语言=' + VLang.Text + ' -metadata:s:a:0 语言=' + ALang.Text +' '

变量 'quote' 被定义为 '"' 并且在 Windows 上,整个标题被正确插入到元数据中,但在 Linux 上,它显示为带有引号的“Some title”。更改为单引号会在单引号中给出 'Some title'引号,插入空格会在右引号之前插入一个空格,删除引号会导致错误。

也许一个肮脏的解决方法是创建一个用不可破坏的空格替换空格的函数,但这并不令人满意,并且它可能在某些播放器中错误地显示。

于 2018-03-25T14:19:47.493 回答