Diffusion d'une vidéo créée par programme sur YouTube à l'aide de node et ffmpeg

Sep 23 2020

J'ai essayé de diffuser en direct une image créée par programme sur YouTube à l'aide de node. J'ai eu un succès très limité avec FFmpeg. Bien que j'aie réussi à créer et à enregistrer une image grâce à ce fil perspicace, je n'ai pas encore fait fonctionner le code pour le streaming sur un serveur 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
})();

Lors de l'exécution de ce code, aucune erreur n'apparaît et tout semble fonctionner, cependant, YouTube signale qu'aucune donnée n'est reçue. Quelqu'un sait-il ce qui ne va pas ici?

Mise à jour: Ceci est vraiment contre-intuitif, mais l'ajout d'une barre oblique à la destination comme ceci 'rtmp://a.rtmp.youtube.com/live2/[redacted]/'amène ffmpeg à lancer un générique I/O error. C'est vraiment bizarre pour moi. Toutes mes excuses si la réponse à cette question est évidente, je suis vraiment inexpérimenté avec ffmpeg.

Réponses

3 llogan Sep 24 2020 at 00:57

C'est spécifiquement un ffmpegproblème, donc le nœud et les trucs javascript sont une complication inutile (à moins que ce ffmpegne soit même pas en cours d'exécution). Il est préférable de faire fonctionner la ffmpegcommande dans une interface de ligne de commande avant de l'ajouter à un code.

  • YouTube nécessite un flux audio, alors ajoutez -re -f lavfi -i anullsrcune option d'entrée pour générer un son silencieux.

  • La sortie doit être YUV 4: 2: 0 pour la diffusion en direct, ajoutez donc -vf format=yuv420pune option de sortie.

  • Il est également recommandé d'ajouter -g, -b:v, -maxrateet les -bufsizeoptions de sortie lors de la diffusion ( exemples ).

  • Définissez les encodeurs avec -c:v libx264 -c:a aacdes options de sortie pour vous assurer qu'il ne choisit pas automatiquement l'ancien encodeur merdique nommé flv1 qui est la valeur par défaut pour flv muxer ( -f flv).