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

Posted

技术标签:

【中文标题】使用 node 和 ffmpeg 将编程创建的视频流式传输到 youtube【英文标题】:Streaming a programatically created video to youtube using node and ffmpeg 【发布时间】:2021-01-09 18:05:57 【问题描述】:

我一直在尝试使用 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 真的很缺乏经验。

【问题讨论】:

【参考方案1】:

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

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) 的默认值。

【讨论】:

以上是关于使用 node 和 ffmpeg 将编程创建的视频流式传输到 youtube的主要内容,如果未能解决你的问题,请参考以下文章

13 rtsp视频服务 基于node+ffmpeg 转换为 flv 视频服务

如何在android上使用ffmpeg录制视频?

javascript Node.JS功能使用FFMPEG将IP摄像机的mp4 / h.264视频转换为HTML5视频标签

ffmpeg:如何将 wav 作为音频输入来创建视频?

Node.js - 将数据缓冲到 Ffmpeg

在 c++ 中以可变帧速率使用 FFmpeg 库(不是 libav 分支)以编程方式捕获视频