节点fluent-ffmpeg杀死进程会杀死服务器-如何启动和停止记录器?

时间:2019-03-15 12:16:57

标签: node.js macos express ffmpeg screen-recording

我在节点应用程序中使用fluent-ffmpeg。从屏幕/摄像机录制到mp4文件。想要服务器请求启动而另一个请求停止记录(链接到Web界面-测试某种技术,以便稍后使用它来开发Electron App)。

启动很好,但是无法弄清楚如何停止。

这是要启动的代码(在MacOS上运行):

recordingProcessVideo = ffmpeg(`${screenID}:none`)
     .inputFormat('avfoundation')
     .native()
     .videoFilters(`crop=${width}:${height}:${x}:${y}`)
     .save(filePath);

这就是我想从文档和有关该主题的阅读中阻止它的方式:

recordingProcessVideo.kill('SIGINT');

但是,当我调用此命令时,服务器退出并显示以下模糊消息:

code ELIFECYCLE
errno 1

此外,生成的视频文件不会像在完成之前退出一样打开。从文档和人们写的内容来看,似乎无法解决这个问题,启动和停止记录器应该是进行该过程,然后在准备就绪时将其终止。任何人都知道正确的方法-一直在寻找年龄,但找不到任何答案。

使用在MacOS 10.14.3上运行的Node v10.15.2和Ffmpeg版本V92718-g092cb17983

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我已经通过跟踪终端中发出的所有消息FFMpeg解决了该问题。由于某些未知原因,我安装的FFMpeg在完成视频时引发错误,并且无法正确关闭文件。尽管错误并没有真正显示出来,但最终还是会在终端上发生,最终导致MP4可以在所有视频播放器(甚至是浏览器)中正​​常运行,但Quicktime除外,这就是我在此使用的功能。场合。为了防止错误使我的Node应用程序崩溃,我只需要向视频通话中添加错误处理程序即可。确实,我是在原始代码中添加处理程序,但我是将其添加到进程中,而不是原始调用FFMPeg。因此,有效的代码如下所示(我捕获了所有结束事件并将其记录在此示例中)。

recordingProcessVideo = ffmpeg(`${screenID}:none`)
 .inputFormat('avfoundation')
 .videoFilters(`crop=${width}:${height}:${x}:${y}`)
 .native()
 .on('error', error => console.log(`Encoding Error: ${error.message}`))
 .on('exit', () => console.log('Video recorder exited'))
 .on('close',  () => console.log('Video recorder closed'))
 .on('end', () => console.log('Video Transcoding succeeded !'))
 .save(file.video);

我的笔记本电脑上有两个版本的FFMpeg,但都失败了。我的计算机(V4.1.1)上已安装了官方下载的发行版,而我的应用程序正在使用Node打包版本,这将使通过Electron的分发更加容易,因为它不依赖于在运行该应用程序的本地计算机上安装FFMpeg( @ ffmpeg-installer / ffmpeg)。因此,视频无法导出的原因是与笔记本电脑有关的一些不可思议的原因,但我必须弄清楚,但重要的是,我的代码现在可以正常工作,并且可以抵抗这种失败。