Transmitir um vídeo criado de maneira programática para o YouTube usando node e ffmpeg

Sep 23 2020

Tenho tentado transmitir ao vivo uma imagem criada programaticamente para o YouTube usando o node. Tive um sucesso muito limitado usando o FFmpeg. Embora eu tenha conseguido criar e salvar uma imagem graças a este segmento perspicaz, ainda não fiz o código funcionar para streaming para um servidor 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
})();

Ao executar este código, nenhum erro aparece e tudo parece estar funcionando, no entanto, o YouTube relata que nenhum dado está sendo recebido. Alguém sabe o que está errado aqui?

Update: Isso é realmente contra-intuitivo, mas adicionar uma barra ao destino como esta 'rtmp://a.rtmp.youtube.com/live2/[redacted]/'faz com que o ffmpeg lance um genérico I/O error. Isso é muito estranho para mim. Peço desculpas se a resposta for óbvia, sou realmente inexperiente com o ffmpeg.

Respostas

3 llogan Sep 24 2020 at 00:57

Isso é especificamente um ffmpegproblema, portanto, o nó e as coisas do javascript são uma complicação desnecessária (a menos que ffmpegnem esteja em execução). É melhor fazer o ffmpegcomando funcionar em uma interface de linha de comando antes de adicioná-lo a qualquer código.

  • O YouTube requer um fluxo de áudio, então adicione -re -f lavfi -i anullsrca opção de entrada para gerar áudio silencioso.

  • A saída deve ser YUV 4: 2: 0 para streaming ao vivo, portanto, adicione -vf format=yuv420pa opção de saída.

  • Também é recomendado para adicionar -g, -b:v, -maxrate, e -bufsizeopções de saída quando streaming ( exemplos ).

  • Defina os codificadores com -c:v libx264 -c:a aacopções de saída para garantir que ele não escolha automaticamente o codificador antigo e de baixa qualidade chamado flv1, que é o padrão para flv muxer ( -f flv).