Capture o fluxo RTSP da câmera IP e armazene


17

Eu tenho algumas câmeras IP que produzem um fluxo RTSP (h264 mpeg4).

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

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

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

EDIT: O NAS é decapitado (HP N55L ou algo assim) e o RaspberryPi também.

Eu já procurei no ZoneMinder, mas preciso de algo pequeno. Eu esperava que talvez estivesse usando o Motion para detectar movimento no fluxo, mas isso acontecerá mais tarde.


Por que não usar o VLC para Linux?
LatinSuD

1
Opa, esqueci de mencionar que o servidor FreeNAS e o RaspberryPi's não têm cabeça!

Você pode usar o VLC na linha de comando. Não é trivial, mas possível.
LatinSuD

Como o RTSP é apenas um protocolo, ele apenas despeja o conteúdo do h264 ou eu preciso que o VLC o transcodifique?

1
Bem, isso faz parte do vodu da linha de comando do VLC, e desculpe, é por isso que não estou dando uma resposta completa aqui. Eu acho que uma transcodificação total não é necessária, mas talvez mude o contêiner. Espero que algum especialista em VLC apareça aqui.
LatinSuD

Respostas:


28

As câmeras IP são de qualidade variável, algumas se comportando de maneira irregular na minha experiência. Lidar com seus fluxos 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 obter fluxos de áudio / vídeo RTSP via CLI: http://www.live555.com/openRTSP/

Por exemplo, para salvar o áudio / vídeo RTSP de uma câmera em arquivos no formato QuickTime (AVI e MP4 também disponíveis), 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 o openRTSP use como padrão o UDP, o que pode reduzir um pouco o tráfego de rede. Você precisará jogar com as opções para encontrar a combinação que mais lhe convém.

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

Às vezes, o cliente openRTSP não captura essas falhas. Portanto, optei por codificar um controlador em Python usando o módulo 'subprocesses' para chamar e monitorar o stdout de cada instância do cliente openRTSP e também verificar se os arquivos continuam aumentando de tamanho.

Este parece ser um subproduto do segmento mais baixo da indústria de CFTV, atuando de maneira rápida e flexível com os padrões, sendo RTSP e ONVIF os dois mais frequentemente abusados.

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

Eu uso o openRTSP em alguns Raspberry Pi B + executando o Raspbian. Cada fluxo de 1280x1024 ocupa cerca de 8 a 10% do tempo da CPU, e eu executei com êxito até oito câmeras por RPi, gravando os arquivos no armazenamento NAS. Outro RPi processa arquivos concluídos com ffmpeg, pesquisando movimento e produzindo PNGs de índice desses quadros, para ajudar na detecção de invasões.

Há um esforço de código aberto chamado ZoneMinder que faz essa última parte, mas não consegui fazê-lo funcionar com minhas câmeras. O suporte ao ONVIF é novo e incipiente no ZM, e não parece funcionar bem com os fluxos RTSP irregulares produzidos pelo meu zoológico de câmeras IP abaixo de US $ 100.


Ótima solução Kevin, você poderia compartilhar mais com a solução de indexação de busca por movimento / png - pelo menos onde procurar mais?
Igor

@ Kevin-Prichard Eu queria entender: 1. Se eu pudesse converter, digamos, CV analógico SD CVSB para fluxo IP, sua solução funcionaria? (Eu quero capturar vídeos mp4 em partes de 1 hora de cada fonte) E eu seria capaz de gravar 300 desses fluxos em uma única rede 24/7 ou isso sobrecarregaria a rede? 2. É possível converter SD / CVSB analógico em fluxo IP?
CP3O 19/09/17

7

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

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

Este é o comando que eu corro 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 especificado e sai mais tarde. O parâmetro vlc: // quit é necessário, pois o VLC para de gravar e fica 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 é iniciada.


7

Se eu sigo 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 a duração do clipe dependerá das taxas de quadros de entrada e saída)


5

O VLC parece um candidato ideal para processar seu fluxo. Os métodos básicos para capturar um fluxo são descritos no site da Videolan. Gravei com êxito 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

Eu sugeriria executar um script que encerre esse processo vlc e iniciar uma nova instância a cada 30 minutos, pois não tenho certeza de que o VLC possa fazer isso.

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


1
Você também pode usar o FFMPEG para fazer exatamente o mesmo trabalho. Você ainda precisará montar seu NAS conforme a resposta sugere.
Kinnectus
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.