使用Node和ffmpeg将以编程方式创建的视频流式传输到youtube

时间:2020-09-23 13:58:49

标签: javascript node.js ffmpeg youtube rtmp

我一直在尝试使用node将通过程序创建的图像实时流传输到youtube。使用FFmpeg取得的成功非常有限。尽管借助this富有洞察力的线程,我设法创建和保存了图像,但我尚未使代码能够用于流传输到RTMP服务器。

const cp = require('child_process'),
    destination = 'rtmp://a.rtmp.youtube.com/live2/[redacted]', //stream token redacted
    proc = cp.spawn('./ffmpeg/bin/ffmpeg.exe', [
        '-f', 'rawvideo',
        '-pix_fmt', 'rgb24',
        '-s', '426x240',
        '-i', '-', //allow us to insert a buffer through stdin
        '-f', 'flv',
        destination
    ]);

proc.stderr.pipe(process.stdout);

(function loop() {
    setTimeout(loop, 1000 / 30); //run loop at 30 fps
    const data = Array.from({length: 426 * 240 * 4}, () => ~~(Math.random() * 0xff)); //create array with random data
    proc.stdin.write(Buffer.from(data)); //convert array to buffer and send it to ffmpeg
})();

运行此代码时,不会出现错误,并且一切正常,但是,YouTube报告没有接收到任何数据。有人知道这里出了什么问题吗?

更新:这确实是违反直觉的,但是像这样的'rtmp://a.rtmp.youtube.com/live2/[redacted]/'在目标处添加斜杠会导致ffmpeg抛出泛型I/O error。这对我来说真的很奇怪。抱歉,如果答案很明显,我对ffmpeg完全没有经验。

1 个答案:

答案 0 :(得分:3)

这特别是一个ffmpeg问题,因此节点和javascript东西是不必要的复杂性(除非ffmpeg甚至没有执行)。最好先将ffmpeg命令在命令行界面中使用,然后再将其添加到任何代码中。

  • YouTube需要音频流,因此请添加-re -f lavfi -i anullsrc输入选项以生成无声音频。

  • 要进行实时流式传输,输出必须为YUV 4:2:0,因此请添加-vf format=yuv420p输出选项。

  • 还建议在流式传输(examples)时添加-g-b:v-maxrate-bufsize输出选项。

  • >
  • 使用-c:v libx264 -c:a aac输出选项设置编码器,以确保它不会自动选择名为flv1的cr脚的旧编码器,这是flv混合器(-f flv的默认设置)。

  • >