Quero gerar uma assinatura de compasso um tanto aleatória em um script bash usando uma variável. Eu tenho um arquivo de vídeo com 11 horas de duração e estarei mixando um podcast mp3 de 50 minutos que baixo na maioria dos dias da semana com o vídeo usando a ffmpeg
opção -shortest (que cortará o vídeo para ter a duração do muito áudio mais curto). Então, quero que o áudio seja inserido no vídeo todos os dias em um ponto aleatório, no máximo 50 minutos antes do final do vídeo.
O que descobri até agora utiliza os comandos date
e shuf
. Usando shuf
eu gero uma string aleatória de 5 dígitos entre 36305 e 72850 e a alimento da date
seguinte maneira:
date --date="$(shuf -i 36305-72850 -n 1) sec ago" +%T
(a sequência de 5 dígitos está dentro do intervalo, em segundos, entre 10h10, por um lado, e a meia-noite anterior, por outro - 10h sendo 36.305 segundos e meia-noite sendo 72.805 segundos antes da execução do meu script) . Isso parece funcionar bem para gerar o carimbo de data/hora necessário, mas suspeito que existam maneiras alternativas de gerar o carimbo de data/hora que podem ser mais elegantes e/ou ideais.
Alguma sugestão?
Esclarecimento
O carimbo de data / hora semi-aleatório que estou tentando gerar é algo que é alimentado ffmpeg
pelo -ss
switch e deve assumir a forma de 3 dísticos numéricos separados por dois pontos e em conformidade com as convenções de controle de tempo (para fins práticos relacionados a esta consulta numérica as limitações nos dísticos são 0-24 para o primeiro dístico e 0-60 para os dois segundos - embora para meu uso o primeiro dístico deva ser 0-10 e o segundo 0-10 se o primeiro dístico for 10, caso contrário 0- 60, e o dístico final 0-60). O date
utilitário já foi projetado em conformidade com essas restrições de controle de tempo, e é por isso que pensei em usar algumas variações date +%T
primeiro.
O ffmpeg
comando que estou executando é algo como o seguinte
ffmpeg -ss 02:54:32 -i 11-hr_video.mp4 -i todays_50-min_audio.mp3 -codec copy -shortest muxed_video-audio.mp4
Preciso de um valor semi-aleatório para inserir depois -ss
e o date
encantamento que ofereci faz esse tipo de coisa. Então, como exemplo, por volta das 20h (horário em que meu script é executado na maioria dos dias), esse encantamento, o ffmpeg
comando seria parecido com o seguinte:
ffmpeg -ss $(date --date="$(shuf -i 36305-72850 -n 1) sec ago" +%T) -i 11-hr_video.mp4 -i todays_50-min_audio.mp3 -codec copy -shortest muxed_video-audio.mp4
Estou criando uma variável no meu script para armazenar o valor semi-aleatório que está sendo gerado. Então eu tenho no meu script algo como
starttime=$(date --date="$(shuf -i 36305-72850 -n 1) sec ago" +%T)
Meu script é acionado por volta das 20h na maioria dos dias, portanto, subtrair o número especificado de segundos obtém um carimbo de data/hora próximo à meia-noite anterior, por um lado, e um segundo próximo às 10h10, por outro. Assim, um intervalo de aproximadamente 10 horas e 10 minutos para selecionar semi-aleatoriamente um horário de início onde posso começar a mixar o áudio no vídeo.
Espero que este esclarecimento ajude. A propósito, gosto mais do encantamento de Freddy do que daquele que propus, então provavelmente irei usá-lo.
Responder1
Não entendi o que você conseguiu com seu date
comando, então posso estar completamente errado sobre o que você deseja.
Para gerar um horário entre 00:00:20 e 10:10:00 com GNU date
, você pode fazer:
hora de início:
$ date --date "1970-01-01 00:00:20" '+%T'
00:00:20
hora de término (36.580 segundos depois):
$ date --date "1970-01-01 00:00:20 36580 sec" '+%T'
10:10:00
algo intermediário:
date --date "1970-01-01 00:00:20 $(shuf -n1 -i0-36580) sec" '+%T'