以下代码由我的主 app.js 使用 child_process.fork() 方法作为模块加载:
var spawn = require('child_process').spawn;
var ffmpeg = spawn('C:\\Program Files (x86)\\ffmpeg\\bin\\ffmpeg.exe', ['-y', '-threads', '-0', '-re', '-rtbufsize', '204800000', '-probesize', '4096', '-vsync', '2', '-async', '30', '-f', 'dshow', '-s', '320x240', '-i', 'video=Integrated Webcam:audio=Microphone Array (IDT High Defi', '-c:a', 'libvo_aacenc', '-ab', '48000', '-ar', '22050', '-ac', '2', '-c:v', 'libx264', '-s', '400x300', '-g', '96', '-x264opts', 'bitrate=1200', '-preset', 'ultrafast', '-profile:v', 'baseline', '-pix_fmt', 'yuv420p', '-aspect', '4:3', '-f', 'flv', 'rtmp://server']);
setTimeout(function() {
ffmpeg.stderr.on('data', function() {
ffmpeg.stdin.setEncoding('utf8');
ffmpeg.stdin.write('q');
process.exit();
});
}, 10000);
它远没有我做的那么复杂。主 app.js 是一个基本的 HTML 页面,它提供服务并使用 socket.io 接收事件及其相应的数据。在这种情况下,'true' 事件会加载 module.js 文件,该文件会启动 FFMPEG 的实时捕获会话,将其馈送到 RTMP 服务器,并在 10 秒的超时后正常关闭 FFMPEG。
我的下一个任务是通过从 Web 界面触发的事件将其关闭,而不是当前的超时测试方法。
查看 Windows 中的任务管理器,FFMPEG 进程与辅助节点进程一样关闭。
原因是我发现的 node-ffmpeg 模块都不支持通过捕获输入进行实时流式传输。它们似乎主要用于对现有内容进行转码。理想情况下,最终结果将是一个可以启动和停止 FFMPEG 的基于 Web 的界面。我们的用例将替换 Adobe Flash Media Live Encoder 作为我们的 Adobe Media Server 的源,因为它无法保存标准 mp4 文件。