我在节点应用程序中使用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
感谢您的帮助。
答案 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)。因此,视频无法导出的原因是与笔记本电脑有关的一些不可思议的原因,但我必须弄清楚,但重要的是,我的代码现在可以正常工作,并且可以抵抗这种失败。