我有一个使用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手册中获得太多信息。
答案 0 :(得分:1)
如果ffmpeg
在stdout / stderr上产生了很多(调试)输出,你需要确保它被读取,或你用child_process.spawn()
调用它选项{ stdio : 'ignore' }
。
否则,Node将继续收集数据,并且在某些时候将阻止(至少,我认为它)生成的进程,直到所有数据都被读取。
要阅读数据,请将data
个事件监听器附加到tmpProcess.stdout
和tmpProcess.stderr
。或者使用前面提到的ignore
让Node忽略所有输出(在您的情况下,这可能是最好的解决方案,因为您对控制台输出不感兴趣)。