使用 Node JS 将 h264 文件转换或包装为 mp4

cdo*_*ern 1 javascript mp4 h.264 node.js raspberry-pi

我正在 Raspberry Pi 上拍摄视频,并希望将原始 h264 文件转换为 mp4 文件,或者像使用命令行/Python 那样将其包装在 mp4 中。但是,我希望在 NodeJS 中做到这一点。似乎有很多 node JS 库在 npm 上使用了 Raspberry Pi 的 mp4-box 库。但是,它们都没有适当的文档或似乎适合我的项目的需要。我不知道我是否遗漏了什么或者这是不可能的。

小智 5

没有直接的方法可以将 H.264 编码的文件嵌入到 MP4 容器中,而无需从头开始实际构建整个文件结构。这可行的,但为了做到这一点,您需要了解 mp4 容器格式(它在很大程度上基于 Quicktime MOV 容器)并使用TypedArrays可以保存为 MP4 文件的结果构建它(我在这里创建了一个粘贴描述容器文件结构)。

另一种方法是从 Node.js生成FFmpeg(或直接使用该软件)并提供 H.264 作为输入并将其保存为 MP4 文件。这很直接。该命令将类似于:

ffmpeg -i yourH264encodedFileHere -c:v copy mp4FileContainer.mp4
Run Code Online (Sandbox Code Playgroud)

要从 Node 运行它,可以使用spawn(参见示例)。

这种基本方法的替代方法是安装和使用fluent-ffmpeg NPM 模块,它可以完成所有繁重的工作。

例子

var ffmpeg = require("fluent-ffmpeg");
var inFilename = "video.h264";
var outFilename = "video.mp4";

ffmpeg(inFilename)
  .outputOptions("-c:v", "copy") // this will copy the data instead or reencode it
  .save(outFilename);
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • fluent 对文件名(空格等)可能很挑剔。
  • FFmpeg 需要预先安装并在全局路径中可用。如果你不想要它,你可以使用ffmpeg.setFfmpegPath(pathToFFmpegBin)代替。
  • 要在 RPI 上安装 FFmpeg,此资源可能很有用。