Capture o fluxo RTSP da câmera IP e armazene

13

Tenho algumas câmeras IP que geram um fluxo RTSP (h264 mpeg4).

Atingir o URL localmente via VLC: rtsp: //192.168.0.21: 554 / mpeg4

Eu posso transmitir a câmera e despejo para o disco (na minha área de trabalho). No entanto, gostaria de armazenar esses arquivos no meu NAS (FreeNAS). Eu estava procurando maneiras de capturar o fluxo RTSP e despejá-los no disco, mas não consigo encontrar nada.

É possível capturar o fluxo no FreeBSD ou no Linux (RaspberryPi) e descarregar o conteúdo transmitido em um disco local para o Linux ou FreeBSD - de preferência a cada 30 minutos?

EDITAR: O NAS é sem cabeça (HP N55L ou algo assim) e os RaspberryPi também estão sem cabeça.

Eu já procurei no ZoneMinder, mas preciso de algo pequeno. Eu estava esperando talvez usar o Motion para detectar movimento no fluxo, mas isso virá mais tarde.

    
por Keerthi 09.06.2014 / 10:56

4 respostas

20

As câmeras IP são de qualidade variável, algumas se comportando de forma irregular na minha experiência. Lidar com seus fluxos de RTSP requer uma dose de tolerância a falhas.

O projeto Live555 fornece uma implementação de cliente RTSP relativamente tolerante a falhas, openRTSP, para extrair fluxos de áudio / vídeo RTSP via CLI: link

Por exemplo, para salvar o áudio / vídeo RTSP de uma câmera em arquivos no formato QuickTime (também disponível AVI e MP4), um arquivo a cada 15 minutos:

$ openRTSP -D 1 -c -B 10000000 -b 10000000 -q -Q -F cam_eight -d 28800 -P 900 -t -u admin 123456 rtsp://192.168.1.108:554/11

Essas opções significam:

-D 1 # Quit if no packets for 1 second or more
-c   # Continuously record, after completion of -d timeframe
-B 10000000 # Input buffer of 10 MB
-b 10000000 # Output buffer 10MB (to file)
-q   # Produce files in QuickTime format
-Q   # Display QOS statistics 
-F cam_eight  # Prefix output filenames with this text
-d 28800      # Run openRTSP this many seconds
-P 900        # Start a new output file every -P seconds
-t            # Request camera end stream over TCP, not UDP
-u admin 123456  # Username and password expected by camera
rtsp://192.168.1.108:554/11  # Camera's RTSP URL

A remoção da opção -t faz com que openRTSP seja padronizado para UDP, o que pode reduzir o tráfego de rede um pouco. Você precisará jogar com as opções para encontrar a combinação que mais lhe convier.

Francamente, as próprias câmeras às vezes não são confiáveis, ou apenas implementadas diferentemente - como fechar o soquete inesperadamente não é tão incomum assim.

Às vezes, o cliente openRTSP não detecta esses problemas. Por isso, optei por codificar um controlador em Python usando o módulo 'subprocessos' para invocar e monitorar o stdout de cada instância do cliente openRTSP e também verificar se os arquivos continuam a crescer em tamanho.

Isto parece ser um subproduto da indústria low-end do CCTV que joga rápido e solto com os padrões, RTSP e ONVIF sendo os dois mais freqüentemente abusados.

Felizmente, você geralmente pode contornar esses problemas. A menos que suas câmeras IP e seu controlador sejam todos projetados para funcionar bem juntos, use apenas o ONVIF para uma única descoberta e gerenciamento de configurações.

Eu uso openRTSP em alguns Raspberry Pi B + rodando Raspbian. Cada fluxo de 1280x1024 ocupa cerca de 8-10% do tempo da CPU, e tenho executado com êxito até oito câmeras por RPi, gravando os arquivos no armazenamento NAS. Outro RPi processa arquivos concluídos com o ffmpeg, procurando por movimento e produzindo PNGs de índice desses quadros, para ajudar a identificar arrombamentos.

Existe um esforço de código aberto chamado ZoneMinder que faz esta última parte, mas não consegui fazê-lo funcionar com as minhas câmeras. O suporte a ONVIF é novo e incipiente na ZM, e não parece competir bem com os fluxos RTSP produzidos pela minha coleção de câmeras IP abaixo de US $ 100.

    
por 30.05.2015 / 00:33
6

Eu apenas pensei em adicionar meus dois centavos e complementar a resposta da BjornR.

Em vez de executar um cron job para matar periodicamente o processo VLC, pode-se dizer ao VLC para rodar por um período de tempo especificado e fechar depois.

Este é o comando que eu executo na minha caixa:

/usr/bin/vlc -vvv rtsp://192.168.1.128:1554/11 --sout=file/ts:/media/path/to/save/location/recording-$(date +"%Y%m%d%H%M%S").ts -I dummy --stop-time=480 vlc://quit

Isso executa o VLC pelo período de tempo especificado e depois sai. O parâmetro vlc: // quit é necessário, pois o VLC pararia de gravar e permaneceria aberto. Este comando precisa ser colocado dentro de um loop.

O único problema que encontrei até agora é que ele pode perder alguns segundos toda vez que uma nova gravação começar.

    
por 02.04.2015 / 00:52
4

O VLC parece um candidato ideal para processar seu fluxo. Os métodos básicos para capturar um fluxo estão descritos no site Videolan. Eu gravei com sucesso a saída da minha câmera de rede D-Link DCS-5222 usando o seguinte comando:

vlc rtsp://user:password@ip/play1.sdp --sout=file/ogg:mystream.ogv

No seu caso, isso pode funcionar para salvar a saída localmente:

vlc rtsp://192.168.0.21:554/mpeg4 --sout=file/ts:mystream.mpg

Sugiro executar um script que termine esse processo de vlc e inicie uma nova instância a cada 30 minutos, pois não tenho certeza se o VLC é capaz de fazer isso.

Quanto ao armazenamento em um NAS, basta montá-lo em seu sistema de arquivos local.

    
por 09.06.2014 / 14:06
3

Se eu seguir sua pergunta corretamente, por que você não tenta o seguinte comando em um sistema Linux (RPi):

ffmpeg -i rtsp://192.168.0.21:554/mpeg4 -vcodec copy -acodec copy -map 0 -f segment -segment_time 300 -segment_format mp4 "ffmpeg_capture-%03d.mp4"

Isso deve salvar o vídeo em pedaços de 300 segundos. (Observe que o comprimento do clipe dependerá das taxas de quadros de entrada e saída)

    
por 26.06.2017 / 14:49