观看完成的视频编码的最佳实践是什么?

时间:2019-11-25 02:57:13

标签: node.js video encoding adobe-premiere chokidar

TL; DR

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

上下文

我已经为我们的办公室开发了一个工作流,该工作流使我们能够在Adobe Premiere Pro中快速对编码作业进行排队。为了在本地排队,我使用了Premiere的CEP API。我可以轻松地将作业发送到Adobe Media Encoder(在同一台计算机上),它将自动将视频文件编码到相对的项目目录中。效果很好。

要将编码作业排队到LAN工作站上,我采用了另一种方法,因为CEP API不允许本地计算机以外的任何扩展。相反,我利用Adobe 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将注册“ add”。由于文件已锁定,因此移动失败。显然,仅复制或移动完成的视频文件时,此方法就可以正常工作。

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
    },
  });

0 个答案:

没有答案