Eu tenho uma câmera de segurança rodando Linux (busybox 1.32.0) que posso configurar para gravar vídeo continuamente em pedaços (configuráveis) de 30 segundos em uma estrutura de pastas:
recording/2022/04/26/15/2022-04-26-15-30-00.mp4
Em outra pasta, as imagens estáticas são gravadas somente quando o movimento é detectado:
stills/2022/04/26/15/2022-04-26-15-30-05.jpg
Esta é uma solução que inventei para obter vídeos antes mesmo de um movimento ser detectado.
Como o espaço disponível é limitado, gostaria de excluir qualquer vídeo iniciado mais de 60 segundos antes do movimento e 120 segundos após o movimento, para que eu mantenha alguns pré e pós-vídeo para cada imagem estática.
As imagens estáticas podem ser tão frequentes quanto a cada 5 segundos, pois são baseadas em disparos por movimento e não em um intervalo predefinido.
Claro, com uma única imagem é uma questão de executar "find" com as opções apropriadas , mas e o meu caso de uso mais complexo?
Eu pensei em algumas maneiras possíveis, mas não tenho certeza de como proceder.
Pensei em executar um script todos os dias que listasse os elementos (gravações e fotos) do dia anterior, convertesse de nome de arquivo em carimbo de data e hora de cada um deles e comparasse iterativamente os carimbos de data e hora com os carimbos de data e hora das imagens estáticas.
Isso envolveria 4 listas (nomes de arquivos, carimbos de data/hora, para gravações e fotos) e me parece bastante envolvido (talvez porque não esteja familiarizado com scripts de shell), então existe uma maneira mais fácil de fazer isso?
Soluções envolvendo python ou perl exigiriam a compilação para a plataforma, e podem impor uma carga muito alta na CPU, sem contar que o espaço livre no dispositivo já é limitado e um executável samba 4.x já não caberia.
As ferramentas disponíveis são aquelas disponíveis como parte do busybox mais os binários listados no site do projeto .
Sem usar o conceito de tempo, confie nos nomes dos arquivos e no fato de que classificá-los em ordem alfabética é o mesmo que classificar por tempo.
Primeiro passo:
Obtenha gravações e fotos por um período de tempo com
find
,sort
os argumentos pelo nome do arquivo. Fotos e vídeos juntos são classificados por tempo agora.grep
para as fotos, mantendo as falas antes e depois de qualquer partida (brinque com -B, -A para ver o quanto você gostaria) e por fim pegue apenas as gravações para guardar.A saída intermediária do primeiro
grep
ficaria assim, para 2 antes, 4 depois:Segundo passo:
para excluir os arquivos a serem mantidos das gravações e remover o restante deles.
Notas:
Os nomes dos arquivos devem ser planos, sem espaços e caracteres especiais, não sei se mais opções funcionam para o seu busybox. Para a versão que instalei e executei o comando, 1.34, vejo que
-print0
existe para find, e-z
para sort, mas não para grep, e-0
para xargs também existe.Também assumimos que todas as gravações existem para o período alvo. Mas mesmo que não tenham, não removemos nenhum fragmento útil, na pior das hipóteses poderíamos manter apenas mais alguns, por exemplo, se não houver vídeo em torno de uma foto, manteremos os fragmentos mais próximos, independentemente de quando forem .
É definitivamente possível usar um script de shell, mas você terá um trabalho mais fácil usando Python. Você pode conferir o módulo os para Python, que permite obter todos os arquivos em um diretório.
Então tudo o que você precisa fazer é comparar o nome do arquivo com um regex e excluir os arquivos indesejados.