Streaming de imagem com ffmpeg para um servidor

0

Eu tenho uma câmera IP e recebo os JPEGs instantâneos dessa câmera IP. Tem uma média de 10fps.

Atualmente estou invocando um [método da web] no meu aplicativo de área de trabalho c # para carregar o JPEG (convertido em uma matriz de bytes). Lá, no servidor, o usuário pode visualizar essas imagens como um feed de vídeo. Isso funciona bem. No lado do cliente, o uso de RAM aumenta bastante.

Se eu puder codificar as imagens JPEG de alguma forma usando o ffmpeg, a quantidade de dados será reduzida (eu acho).

Ou existe uma maneira de levar um fluxo de bytes dos JPEGs chegando e de alguma forma redirecionar para o servidor onde eu poderia ter outro processo ffmpeg em execução aguardando para aceitar esse fluxo e salvar o fluxo de imagem para imagens individuais?

Eu olhei em volta (passei vários dias) e tentei técnicas diferentes para reduzir o 'peso' das imagens, mas nada parece funcionar. Agora estou olhando para o ffmpeg como minha última esperança.

    
por Andrew Simpson 20.11.2013 / 21:44

1 resposta

2

Se você não usa APIs do FFmpeg em seu código nativamente, você também pode chamar o ffmpeg para produzir qualquer resultado que desejar como um bytestream bruto. Por exemplo:

ffmpeg -i input -c:v mjpeg -f rawvideo -

O - significa que a saída é enviada para stdout . As mensagens de diagnóstico do ffmpeg serão enviadas para stderr , como de costume. Você pode capturar essa saída em seu programa e transmiti-la via transmissão UDP simples para um servidor de escuta.

Para compactar ainda mais o seu fluxo, é claro que você não pode enviar imagem por imagem, mas compactar as imagens como um fluxo de vídeo H.264 bruto:

ffmpeg -i input -c:v libx264 -preset ultrafast -f rawvideo -

Você então analisaria o fluxo de entrada assim, onde - é stdin :

ffmpeg -f rawvideo -c:v h264 -i - output

É claro que você precisa descobrir como canalizar os dados corretamente. O ffmpeg também pode ler de pipes Unix.

Eu fiz algo similar sem o FFmpeg, usando as bibliotecas do codificador XviD em C ++ para produzir um fluxo de bits de vídeo, e depois enviá-lo UDP para outra máquina e analise a partir daí. É factível, mas depende de como sua pilha de rede se parece e quão sofisticada (e resistente a erros) ela precisa ser.

    
por 24.11.2013 / 11:56

Tags