Consumindo e editando vídeos sob demanda em Web APIs usando Node.js Streams e FFmpeg
Hoje em dia, consumir e editar vídeos sob demanda em Web APIs se tornou uma tarefa comum para muitos desenvolvedores. Neste artigo, vamos explorar como podemos fazer isso usando Node.js Streams e FFmpeg.
Node.js Streams
Node.js Streams são uma forma eficiente de ler e processar dados de maneira assíncrona. Eles são particularmente úteis para lidar com grandes arquivos de vídeo, já que podemos processar os dados à medida que eles chegam, em vez de carregar o arquivo inteiro na memória.
FFmpeg
FFmpeg é uma poderosa ferramenta de linha de comando para manipulação de vídeos. Com ela, podemos realizar várias operações, como cortar, redimensionar, converter formatos e muito mais. Integrando o FFmpeg com Node.js, podemos criar aplicações que consomem e editam vídeos de forma eficiente e flexível.
Consumindo vídeos sob demanda
Para consumir um vídeo sob demanda em uma Web API usando Node.js Streams, podemos utilizar a biblioteca `request` para fazer a requisição HTTP e receber o vídeo em pedaços, que podem ser processados à medida que chegam.
Exemplo de código:
const request = require('request'); const fs = require('fs'); const videoUrl = 'https://example.com/video.mp4'; const outputStream = fs.createWriteStream('video.mp4'); request.get(videoUrl).pipe(outputStream);
Editando vídeos sob demanda
Para editar um vídeo sob demanda em uma Web API usando Node.js e FFmpeg, podemos utilizar a biblioteca `fluent-ffmpeg`, que fornece uma interface fácil de usar para integrar o FFmpeg com Node.js e realizar operações de edição de vídeo.
Exemplo de código:
const ffmpeg = require('fluent-ffmpeg'); ffmpeg('video.mp4') .size('320x240') .autopad() .save('video_320x240.mp4');
Conclusão
Consumir e editar vídeos sob demanda em Web APIs usando Node.js Streams e FFmpeg pode trazer muitos benefícios em termos de eficiência e flexibilidade. Com as ferramentas certas e um pouco de conhecimento, podemos criar aplicações poderosas que lidam com vídeo de forma eficiente e escalável.
O vídeo está funcionando corretamente no console, porém quando eu vou exibi-lo no front-end usando handlebars, ocorre um erro e ele não é exibido. Quando eu removo o res.writeHead(200, { 'Content-Type': 'video/mp4'}) ele é exibido mas não no formato mp4. Alguém sabe como resolver esse problema ?
Parabéns mano, que vídeo rico em conteúdo aprendi dms para o meu projeto! Muito obg mesmo, orgulho de ter um br com essa qualidade
Passei horas e não consegui fazer funcionar 🥲
Dia só de derrota.
Que ferramenta está usando para monitorizar a memoria, no mac? (topo do ecrã). obrigado
Mas como que seta o tempo certo da duração do video desse jeito? reparei que não fica fixo
Boa tarde, Erick Wendel!
Cadê seu curso para iniciantes?
Gostaria de fazer o curso avançado contigo, mas cadê o iniciante e intermediário primeiro?
A sua câmera esta tampando a visão dos códigos no terminal,então quando vc digita não da pra saber o que digitou ,procurei no github na pasta em que vc estava digitando em um momento do vídeo e não apareceu o código do terminal la ,seria muito produtivo que colocasse a câmera no lado oposto .
brabo demais
fico muito feliz de ter conteúdo desse nível em português
Shoow! começando agora esse.
Po se o Erick fuc*** Wendel não entendeu bem como usa o ffmpeg-stream então eu fico mais tranquilo de não ter entendido tb rsrs Sou editor de audiovisual e to querendo escrever scripts para automatizar tarefas usando ffmpeg. Acho q vou aprender muito nessa live. Obrigado pelo conteúdo gratuito.
MUITO PICA
Tem como proteger vídeos de download? Com node ou javascript?
ensina a fazer ia com nodejs
Muito show!!!
Excelente conteúdo. Será que você pode fazer conteúdo de ffmpeg no browse, que você comentou na Live?
E Erik é mt fera. Tenho acompanhado os conteúdos dele e é sempre mt top.
Uma dúvida aqui galera: to precisando fazer um gerador de imagens a partir desse stream ensinado.
Consegui o seguinte:
const ffmpegProcess = spawn('ffmpeg', [
'-i', 'pipe:0',
'-vf', 'fps=1',
'-f', 'image2',
'src/media/images/out%d.png'
],
{ stdio: ['pipe', 'pipe', 'pipe'] }
)
createReadStream('src/media/videos/video1.mp4').pipe(ffmpegProcess.stdin);
ffmpegProcess.stderr.on('data', msg => console.log('ERROR: ', msg.toString()));
Ele gera de boa no diretorio apontado. Mas, o que quero mesmo é tirar o path: 'src/media/images/out%d.png'' e jogar no pipe:1. A ideia é capturar esse cara em um buffer no stdout. Já tentei jogar o 'pipe:1' no lugar do path e deu mts erros e nao consigo achar o comando exato pra isso.
Alguma ideia de como resolver isso?
conteudo top
Show DEMAIS!! Seniorzaum! 🚀
foda demais ceh loko