Transmitir um vídeo criado de maneira programática para o YouTube usando node e ffmpeg
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
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).