问题描述
我一直在尝试使用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完全没有经验。
解决方法
这特别是一个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
的默认设置)。 >