
Tenho várias câmeras IP das quais desejo capturar vídeo continuamente. Estou construindo um script que envolverá o ffmpeg para capturar de várias fontes RTSP. Mas estou lutando para capturar e armazenar os dados. Especificamente, como faço para capturar clipes contínuos?
Para esclarecer, se eu apenas executar um comando como este:
ffmpeg -i rtsp://ip_cam file.mp4
Isso funcionará para sempre até encher meu disco rígido (ou até atingir algum limite superior do ffmpeg ou do sistema de arquivos). Então meu pensamento foi fazer algo assim:
ffmpeg -i rtsp://ip_cam -fs 104857600 file-1.mp4
Isso limitaria os arquivos a 100 MB cada. Meu script wrapper pode iniciar uma nova instância assim que esta terminar:
ffmpeg -i rtsp://ip_cam -fs 104857600 file-2.mp4
E assim por diante (posso ter um processo separado que limpará os arquivos antigos conforme necessário para recuperar espaço). O problema com esta abordagem é que leva de 1 a 2 segundos para o ffmpeg iniciar,o que significa que durante esse tempo a câmera em questão não está gravando nada.
Uma coisa adicional a considerar é que, para cada arquivo, preciso saber o carimbo de data e hora de início e término, por exemplo, file-1.mp4
pode referir-se a "12/09/2015 09:03:42" até "12/09/2015 11:24: 21". Dessa forma, se um usuário quiser recuperar um clipe específico, eu saberei onde obtê-lo. E se eu iniciar o ffmpeg para cada clipe e ele terminar no final de cada clipe, posso capturar e armazenar essas informações. Mas se uma abordagem sugerida é dizer ao ffmpeg para ser executado indefinidamente enquanto salva a saída em partes separadas (se o ffmpeg puder fazer isso), isso pode não funcionar, pois não poderei coletar essas informações.
Qualquer visão seria apreciada.
Responder1
Tente omuxer de segmento.
ffmpeg -i rtsp://ip_cam -c copy -f segment -segment_list out.list -segment_time 900 \
-segment_atclocktime 1 -strftime 1 "%Y-%m-%d_%H-%M-%S.mkv"
-segment_list
Gere um arquivo de lista.-segment_time
Defina a duração do segmento. O valor deve ser uma especificação de duração. O valor padrão é 2. Observe que a divisão pode não ser precisa, a menos que você force os quadros-chave do fluxo de referência em um determinado momento. Veja odocumentação do muxer de segmentopara mais informações.-segment_atclocktime
Se definido como "1", divida em intervalos regulares de tempo a partir de 00:00 horas. O valor de tempo especificado em-segment_time
é usado para definir a duração do intervalo de divisão. Por exemplo, com segment_time definido como "900", isso torna possível criar arquivos às 12h, 12h15, 12h30, etc.-strftime
Isso permite que os segmentos sejam nomeados de acordo com o momento da criação do arquivo.
Exemplos de nomes de arquivos de saída:
$ ls -m1
2015-09-12_14-10-02.mkv
2015-09-12_14-10-14.mkv
2015-09-12_14-10-24.mkv
2015-09-12_14-10-34.mkv
2015-09-12_14-10-44.mkv
2015-09-12_14-10-54.mkv
Veja odocumentospara muito mais opções e informações.