我正在使用响应事件的 node.js fluent-ffmpeg 库,并使用以下代码从 RTSP 流中获取三个剪辑:
const getCameraVideoSnapshot = (
rtspUrl: string,
logger: Logger,
lengthInSeconds: number
): Promise<Buffer> => {
return new Promise<Buffer>((resolve, reject) => {
const startTime = new Date();
startTime.setSeconds(startTime.getSeconds() - 10); // Subtract 3 seconds from the current time
const bufferStream = new stream.PassThrough();
const captureVideoCommand = FfmpegCommand(rtspUrl);
captureVideoCommand
.inputOptions(["-rtsp_transport tcp"])
.on("error", (err, stdout, stderr) => {
logger.fatal(stderr);
console.log(err);
reject(err);
})
.addOptions(["-rtsp_transport tcp"])
.audioCodec("aac") // Specify an audio codec (in this case, AAC)
.videoCodec("libx264") // Use libx264 for H.264 encoding
.format("avi") // Use MPEG-4 container format
.size("640x480")
.outputOptions(["-an"]) // Disable audio recording
.outputOptions([`-t ${lengthInSeconds}`]) // Set output duration to 3 seconds
.writeToStream(bufferStream, { end: true });
// Read the passthrough stream
const buffers: Uint8Array[] = [];
bufferStream.on("data", function (buf: Uint8Array) {
buffers.push(buf);
});
bufferStream.on("end", function () {
const outputBuffer = Buffer.concat(buffers);
resolve(outputBuffer);
});
});
};
我相信 FfmpegCommand 转换为命令行输入:
ffmpeg -rtsp_transport tcp -i input_file \
-rtsp_transport tcp \
-c:a aac \
-c:v libx264 \
-f avi \
-s 640x480 \
-an \
-t lengthInSeconds \
- > output_file
90% 的时间里,这一切似乎都运行良好。但有时我会得到一个似乎只包含一帧的 MP4 数据(当它在另一个进程上转换为 GIF 时)。我可以看到,当 MP4 数据上传到 S3 时,文件只有大约 2KB,我假设其中大部分只是 MP4 标头数据。
我还注意到一些 MP4 文件在剪辑的最后跳过了几秒钟,不确定这是否相关。
有人知道我可能哪里出错了吗?
提前致谢!