使用节点和 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
).
我一直在尝试使用 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
).