使用Node JS将h264文件隐藏或包装为mp4

时间:2018-09-03 14:02:46

标签: javascript node.js raspberry-pi mp4 h.264

我正在树莓派上拍摄视频,并希望将原始h264文件转换为mp4文件,或者像使用命令行/ python一样将其包装为mp4。但是,我希望在Node JS中执行此操作。似乎有许多节点JS库在npm上使用raspberry pi的mp4-box库。但是,它们都没有适当的文档或似乎符合我项目的需求。我不知道我是否缺少某些东西,或者这是否不可能。

3 个答案:

答案 0 :(得分:3)

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

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

ffmpeg -i yourH264encodedFileHere -c:v copy mp4FileContainer.mp4

要从Node运行该命令,可以使用spawn(请参见示例)。

这种裸骨方法的替代方法是安装并使用fluent-ffmpeg NPM module来完成所有繁重的工作。

示例

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

一些注意事项:

  • 流利的文件名(空格等)可能很挑剔。
  • FFmpeg需要预先安装并在全局路径中可用。如果您不希望这样做,可以改用ffmpeg.setFfmpegPath(pathToFFmpegBin)
  • 要在RPI上安装FFmpeg,this resource可能会有用。

答案 1 :(得分:1)

尝试在pi 0上安装ffmpeg花费了两个多小时,并以错误告终,因此这是包装mp4的另一种方法:

  1. 安装MP4Box
#include <time.h>

clock_t start, end;
double cpu_time_used;

start = clock();
std::this_thread::sleep_for (std::chrono::seconds(2));
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
  1. 在您的Node脚本中,按照Raspivid docs的说法,使用sudo apt install -y gpac 调用exec命令
MP4Box

答案 2 :(得分:-1)

了解mp4(例如mkv)是一个容器非常重要。您可以将视频,音频,字幕“图层”添加到这些容器中。 H.264已经是压缩格式,它不是原始视频格式。