我目前正在创建一个接收音频/视频流的Node.js应用程序,逐步将其写入磁盘,然后在流结束后使用ffmpeg对其进行转码,并将其发送到其他地方进行存储,并在本地删除。
除了我可以在编写流之前对流进行转码以简化整个过程(计划此功能),在可能的大文件上处理这些操作的最佳方法是什么?
我知道正在使用儿童进程(我目前正在使用的方法),但即使经过大量阅读,我也不确定它们的实际运作方式。我甚至不确定使用" spawn"正是我想要的(是" fork"更好的选择?)。
基本上,我想知道如何转码 - >上传 - >删除文件而不阻塞Node.js,以便多个用户可以同时执行相同的操作。另外,我正在考虑将所有3个操作放在一个bash脚本中,以便它们按顺序同步发生,这样可以吗?
答案 0 :(得分:1)
正确的处理方法是使用Streams - NodeJS中的内置类。
流允许逐步管道数据并一次在1个块上工作。这允许处理大于计算机RAM的文件或像你的情况一样无休止的数据流。
所以不是将数据写入磁盘,而是可以动态处理它,而不会阻塞线程(可以同时转码多个流)。
您还没有共享任何代码,但这是一个通用示例。
const spawn = require('child_process').spawn;
const ffmpeg = spawn('ffmpeg -y -hide_banner -f mpegts -i pipe: -codec copy -f mpegts pipe:');
ffmpeg.stdout.on('data', chunk => {
// upload a transcoded chunk
});
// if the source is also a stream you can pipe it directly like so
// sourceStream.pipe(ffmpeg.stdin);
function onAudioVideoChunkReceived(chunk) {
// handle audio/video input to nodejs server
ffmpeg.stdin.write(chunk)
}
注意使用ffmpeg的特殊输入/输出pipe:
,它允许通过stdin和stdout输入和输出管道