Streaming eines programmgesteuert erstellten Videos auf YouTube mit Node und ffmpeg
Ich habe versucht, ein programmgesteuert erstelltes Bild mithilfe von Node auf YouTube zu übertragen. Ich hatte nur sehr begrenzten Erfolg mit FFmpeg. Obwohl ich dank dieses aufschlussreichen Threads ein Bild erstellen und speichern konnte , muss der Code für das Streaming auf einen RTMP-Server noch funktionieren.
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
})();
Beim Ausführen dieses Codes werden keine Fehler angezeigt und alles scheint zu funktionieren. YouTube meldet jedoch, dass keine Daten empfangen werden. Weiß jemand, was hier falsch läuft?
Update: Dies ist wirklich nicht intuitiv, aber das Hinzufügen eines Schrägstrichs zum Ziel führt dazu, 'rtmp://a.rtmp.youtube.com/live2/[redacted]/'dass ffmpeg ein Generikum auslöst I/O error. Das ist wirklich komisch für mich. Entschuldigung, wenn die Antwort darauf offensichtlich ist, bin ich mit ffmpeg wirklich unerfahren.
Antworten
Dies ist speziell ein ffmpegProblem, daher ist das Knoten- und Javascript-Material eine unnötige Komplikation (es ffmpegsei denn, es wird nicht einmal ausgeführt). Es ist am besten, den ffmpegBefehl in einer Befehlszeilenschnittstelle zum Laufen zu bringen, bevor Sie ihn einem Code hinzufügen.
Für YouTube ist ein Audiostream erforderlich. Fügen Sie daher eine
-re -f lavfi -i anullsrcEingabeoption hinzu, um stummes Audio zu generieren.Die Ausgabe muss für Live-Streaming YUV 4: 2: 0 sein. Fügen Sie daher die
-vf format=yuv420pAusgabeoption hinzu.Es wird ausserdem empfohlen
-g,-b:v,-maxrate, und-bufsizeAusgabeoptionen , wenn (Streaming Beispiele ).Stellen Sie die Encoder mit
-c:v libx264 -c:a aacAusgabeoptionen ein, um sicherzustellen, dass nicht automatisch der beschissene alte Encoder mit dem Namen flv1 ausgewählt wird, der die Standardeinstellung für flv muxer (-f flv) ist.