使用 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 视频服务
javascript Node.JS功能使用FFMPEG将IP摄像机的mp4 / h.264视频转换为HTML5视频标签