Havia uma necessidade de mostrar o vídeo da câmera no site online. Vi várias opções (complementarei as opções dos comentários, se houver):- Dê acesso à câmera. Basta dar acesso à câmera não vale a pena por razões de segurança. A câmera já está deitada com uma carga muito pequena.
- Serviço comercial. Damos a eles acesso à câmera e dinheiro, eles nos dão um link para postar no site. Eles resolvem o problema de compatibilidade da câmera e do navegador do usuário, desempenho e disponibilidade do canal
- Nas suas instalações. Entre o usuário e a câmera, é colocado algo responsável pela compatibilidade, desempenho e acessibilidade do navegador. Nós mesmos resolvemos os problemas.
Vamos considerar esta opção abaixo. Porque " flash morreu " ou " flash está prestes a morrer " , a opção de colocar um flash player em um site não foi considerada. O caminho difícil de encontrar soluções na Internet não levou a uma solução pronta para uso. Eu tive que inventar uma bicicleta.Mais invenções sob o gato.Descrição da bicicleta resultante em mais detalhes:
- Fluxos de câmera de CFTV via protocolo rtsp .
- O ffmpeg pega um fluxo de vídeo da câmera e cria um vídeo para exibição através da tag de vídeo do padrão html5 .
- nginx fornece arquivos criados para usuários
- mostre o vídeo na página usando hls , mais precisamente, essa implementação
Mais sobre configurações
Em cada fluxo da câmera, você precisa executar o ffmpeg para converter rtsp em arquivos que o hls entenderá .ffmpeg e stream com som
/usr/bin/ffmpeg \
-i rtsp://< ONVIF Device Manager> \
-ar 44100 \
-acodec aac -ac 1 -strict -2 -crf 18 \
-c:v copy -preset ultrafast \
-flags -global_header \
-fflags flush_packets -tune zerolatency \
-hls_time 1 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments -start_number 0 \
/tmp/www/index1.m3u8
ffmpeg na inicialização grava 25 fps em FullHDGuessed Channel Layout for Input Stream
Input
Metadata:
title : RTSP Session
Duration: N/A, start: 0.000000, bitrate: N/A
Stream
Stream
Output
Metadata:
title : RTSP Session
encoder : Lavf56.25.101
Stream
Stream
Metadata:
encoder : Lavc56.26.100 aac
Stream mapping:
Stream
Stream
, .
noname.
Como funciona:
Tomamos um fluxo, sem transcodificação, criamos arquivos e uma lista para reprodução na pasta / tmp / www / .nginx
Reduzimos o arquivo padrão do pacote debian para, por exemplo, este:/ etc / nginx / sites-enabled / padrãoserver {
listen 80 default_server;
listen [::]:80 default_server;
access_log off;
error_log /dev/null;
root /tmp/www;
index index.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
Página de exemplo com vídeo:/tmp/www/index.html<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/hls.js/latest/hls.min.js"></script>
<video id="video"></video>
<script>
if(Hls.isSupported()) {
var video = document.getElementById('video');
var hls = new Hls();
hls.loadSource('/index1.m3u8');
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED,function() {
video.play();
});
}
</script>
O script deve ser colocado localmente, não possui dependências externas. Saiba mais sobre as configurações de hls .Como funciona:
hls está conectado na página e reproduz arquivos da lista index1.m3u8. A lista e os arquivos são atualizados pelo ffmpeg.O que aconteceu:
- Isso funciona;
- A maior carga é o ffmpeg, em um processador Atom há três anos;
- Resolução da câmera Full HD sem som - 1%;
- Resolução da câmera Full HD com som - 5%;
- Número de processos nginx - assista por carga e canal disponível. Não conseguimos ver a carga no processador - não é preciso muito para simplesmente fazer upload de arquivos pequenos.;
- Um servidor com ffmpeg e nginx pode ser colocado em qualquer lugar, não necessariamente em uma hospedagem ou no local das câmeras;
- O atraso do fluxo depende do número de arquivos na lista e do tamanho (em segundos) do arquivo. Por exemplo, um atraso de 10 segundos realmente não afeta a visualização do processo de construção de um arranha-céu;
- Os arquivos de vídeo são melhor colocados em tmpfs, são pequenos e geralmente substituídos;
- Todo o serviço deve ser colocado em um contêiner. Todos os pacotes são padrão para
FROM debian:jessie
; - Como resultado da operação, o ffmpeg às vezes trava, é necessário monitorá-lo e reiniciar se ele trava.
Topo de saída do contêiner:top - 11:05:20 up 6 days, 12:15, 0 users, load average: 1.29, 1.09, 1.03
Tasks: 17 total, 1 running, 16 sleeping, 0 stopped, 0 zombie
%Cpu(s): 38.8 us, 1.0 sy, 0.0 ni, 59.6 id, 0.0 wa, 0.0 hi, 0.5 si, 0.0 st
KiB Mem: 16359132 total, 16027988 used, 331144 free, 782968 buffers
KiB Swap: 6369276 total, 3776 used, 6365500 free. 12784916 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
281 root 20 0 341040 29192 19632 S 4.7 0.2 10:08.39 ffmpeg
16 root 20 0 315888 27944 18984 S 1.0 0.2 2:50.95 ffmpeg
9 root 20 0 46916 15128 6408 S 0.3 0.1 0:58.04 supervisord
- Você pode assisti-lo em computadores e dispositivos móveis com navegadores modernos;
- No futuro previsível, não será necessária intervenção.
Referências:
» Implementação de hls» Demonstração de hls» ffmpeg» nginx» O texto expandido e expandido do artigo no meu blog