10M后ffmpeg停止在nodejs上保存视频

时间:2016-05-11 15:12:09

标签: node.js ffmpeg

我有一个使用express(express 4)运行的nodejs服务器。我想根据要求从实验室的几台IP摄像机保存视频。一切正常,但如果视频太长则无法保存(限制似乎是11M)。

我尝试过只使用命令行:

ffmpeg -i rtsp://192.168.1.189:554/ch01_sub.264 -strict -2 -vcodec
copy -vcodec copy test.mp4

这是有效的。但是一旦我使用节点就会遇到麻烦(请注意,这是在节点解析器中,没有代码在express中。我在运行服务器时遇到同样的错误):

var child_process = require('child_process');
tmpProcess = child_process.spawn('ffmpeg',['-i','rtsp://192.168.1.189:554/ch01_sub.264','-strict','-2','-vcodec','copy','-vcodec','copy',"test.mp4"],{maxBuffer: 10000});

这一直持续到test.mp4大约是11M。 tmpProcess没有被杀死,它一直在运行。但是在test.mp4具有一定的大小后,我无法播放它。我得到一个错误,说"此文件不包含可播放的流。" (这是来自图腾,但VLC也不起作用。)

更改maxBuffer并没有帮助。我试图理解我过度浮动的缓冲区但是我无法从节点的api手册中获得太多信息。

1 个答案:

答案 0 :(得分:1)

如果ffmpeg在stdout / stderr上产生了很多(调试)输出,你需要确保它被读取,你用child_process.spawn()调用它选项{ stdio : 'ignore' }

否则,Node将继续收集数据,并且在某些时候将阻止(至少,我认为它)生成的进程,直到所有数据都被读取。

要阅读数据,请将data个事件监听器附加到tmpProcess.stdouttmpProcess.stderr。或者使用前面提到的ignore让Node忽略所有输出(在您的情况下,这可能是最好的解决方案,因为您对控制台输出不感兴趣)。