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

Streaming a programatically created video to youtube using node and ffmpeg

我一直在尝试使用 node.js 将以编程方式创建的图像直播到 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 真的没有经验。

这具体是一个 ffmpeg 问题,因此节点和 javascript 东西是不必要的复杂化(除非 ffmpeg 甚至没有执行)。在将 ffmpeg 命令添加到任何代码之前,最好让 ffmpeg 命令在 command-line 界面中工作。

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

  • 输出必须是 YUV 4:2:0 直播,所以添加 -vf format=yuv420p 输出选项。

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

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