1

TL;博士

我不确定使用 Chokidar 完成视频编码时识别的最佳方法。考虑到编码器构建视频文件的不同方法,容纳所有这些文件的最佳方式是什么?

语境

我为我们的办公室开发了一个工作流程,使我们能够在 Adob​​e Premiere Pro 中快速排队编码作业。为了在本地排队,我使用了 Premiere 的 CEP API。我可以轻松地将作业发送到 Adob​​e Media Encoder(在同一台机器上),它会自动将视频文件编码到相关项目目录。这很好用。

为了将编码作业排队到 LAN 工作站上,我采用了不同的方法,因为 CEP API 不允许在本地机器之外进行任何扩展。相反,我使用 Adob​​e Media Encoder 的监视文件夹来检测添加到我们 NAS 上的子文件夹中的 Premiere 项目文件(一切都在 NAS 上)。这也很好用。

不幸的是,我不知道以与本地排队相同的方式将排队的编码输出到相关项目目录的方式。我试图通过观察一个公共目录并移动完成的文件来找到一种方法。

由于我排队的每个视频文件名都有这样的结构: “projectName_sequenceName_givenName_renderType.mp4/.mxf”我已经能够轻松地移动带有这些信息的文件。但是,我正在努力适应不同编码过程使用的不同方法。不同的编码器 - X264、MainConcept H264 等 - 以不同的方式编码到磁盘。

使用 Chokidar,我观察了不同的编码器如何构建他们的文件:

示例 #1:

如果我启动DnXHR MXF编码,它将首先创建最终的 .MXF 容器,然后填充它。完成后,它会写入 sidecar .XMP 文件。如果编码失败或被取消,sidecar 文件将不会被写入。

示例 #2:

如果我启动TMPG x264编码,它将首先创建最终的 .mp4 容器,然后创建一个临时文件:附加“.mp4_00_”。然后它将一些初始元数据写入最终容器,开始编码到“.mp4_00_”并根据文件大小创建额外的临时文件,“_.mp4_01_”等。最后它向容器写入一些附加信息,然后到临时文件,然后删除临时文件。如果编码失败或被取消,文件将被删除。

示例#3:

如果我启动MainConcept H264 编码(Premiere 的默认设置),它将首先创建音频临时文件,在本例中为“.aac”。然后创建另一个临时文件“.mkv.md0”。在编码的中途,它将创建视频容器“.m4v”,开始对其进行编码,创建更多临时文件“.md7/md6”,创建最终容器“.mp4”以及“sbjo.tmp”,复制将“.mkv”文件和“.aac”放入“.mp4”容器中,添加一个“ 00 ”文件,很快将其删除,然后完成“.mp4”元数据的写入。其中一些发生得非常快,而 Chokidar 并不总是能接受它。除非编码器不一致。

这是我观察到的三种编码类型,它们是我们需要和使用的三种。我想我可以以不同的方式观看它们,但我担心的是,如果我们切换编码器,我将不得不重写代码以适应它们。Adobe Media Encoder 具有的监视文件夹功能可以识别文件何时完成编码,然后再尝试使用它们。我没有测试过每种格式,但是很好。Media Encoder 会适应每个独特的编码过程吗?只是轮询锁定的文件?还是我缺少什么?

我目前的代码适用于 DNxHR MXF,前提是它们没有失败或被取消。它与 h264/x264 示例作斗争。由于文件是在对临时文件进行编码时创建并保持不变的,因此 chokidar 将注册“添加”。由于文件被锁定,移动失败。显然,当简单地复制或移动完成的视频文件时,这可以正常工作。

const watcher = chokidar.watch(['Z:/NETWORKRENDER/Finished/*.{mp4,mxf}'], {
    persistent: true,
    // On start, works on existing files
    ignoreInitial: false, 
    followSymlinks: true,      
    interval: 1000,
    awaitWriteFinish: {
        stabilityThreshold: 5000,
        pollInterval: 20000
    },
  });
4

0 回答 0