Сгенерировать случайное время между 00:00:20 и 10:10:00

Сгенерировать случайное время между 00:00:20 и 10:10:00

Я хочу сгенерировать несколько случайный размер такта в скрипте bash с помощью переменной. У меня есть видеофайл длиной 11 часов, и я буду микшировать 50-минутный mp3-подкаст, который я скачиваю почти каждый будний день, с видео с помощью ffmpegопции -shortest (которая обрежет видео до длины гораздо более короткого аудио). Поэтому я хочу, чтобы аудио вставлялось в видео каждый день в случайной точке не позднее, чем за 50 минут до конца видео.

То, что я придумал до сих пор, использует команды dateи shuf. Используя shufя генерирую случайную 5-значную строку между 36305 и 72850 и передаю ее dateследующим образом:

date --date="$(shuf -i 36305-72850 -n 1) sec ago" +%T

(строка из 5 цифр находится в диапазоне в секундах между 10:10 утра, с одной стороны, и предыдущей полночью, с другой — 10 утра — это 36305 секунд, а полночь — это 72805 секунд до запуска моего скрипта). Кажется, это отлично работает для генерации необходимой временной метки, но я подозреваю, что есть альтернативные способы генерации временной метки, которые могут быть более элегантными и/или оптимальными.

Какие-либо предложения?

Разъяснение

Полуслучайная временная метка, которую я пытаюсь сгенерировать, — это то, что подается ffmpegс помощью -ssкоммутатора и должно иметь форму 3 числовых пар, разделенных двоеточиями и соответствующих соглашениям по отслеживанию времени (для практических целей, связанных с этим запросом, числовые ограничения на пары составляют 0-24 для первой пары и 0-60 для вторых двух — хотя для моего использования первая пара должна быть 0-10, а вторая 0-10, если первая пара равна 10, в противном случае 0-60, а последняя пара 0-60). Утилита dateуже разработана в соответствии с этими ограничениями по отслеживанию времени, поэтому я подумал об использовании некоторой вариации date +%Tпервой.

Команда ffmpeg, которую я запускаю, выглядит примерно так:

ffmpeg -ss 02:54:32 -i 11-hr_video.mp4 -i todays_50-min_audio.mp3 -codec copy -shortest muxed_video-audio.mp4

Мне нужно полуслучайное значение для вставки после, -ssи dateзаклинание, которое я предложил, делает что-то вроде этого. Так что, в качестве примера, используя около 8 вечера (время, когда мой скрипт запускается большинство дней), это заклинание, команда ffmpegбудет выглядеть примерно так:

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

Я создаю переменную в своем скрипте для хранения полуслучайного значения, которое генерируется. Поэтому в моем скрипте есть что-то вроде

starttime=$(date --date="$(shuf -i 36305-72850 -n 1) sec ago" +%T)

Мой скрипт запускается около 8 вечера большую часть дней, поэтому вычитание указанного количества секунд дает временную метку, близкую к предыдущей полуночи, с одной стороны, и секунду, близкую к 10:10 утра, с другой. Таким образом, получается примерно 10 часов 10 минут, из которых можно полуслучайным образом выбрать время начала, когда я могу начать микшировать звук в видео.

Надеюсь, это разъяснение поможет. Кстати, мне больше нравится заклинание Фредди, чем то, что я предложил, так что я, вероятно, воспользуюсь им.

решение1

Я не понял, что вы получили по своей dateкоманде, поэтому могу ошибаться относительно того, чего вы хотите.

Чтобы сгенерировать время между 00:00:20 и 10:10:00 с помощью GNU date, вы можете сделать:

время начала:

$ date --date "1970-01-01 00:00:20" '+%T'
00:00:20

время окончания (36580 секунд спустя):

$ date --date "1970-01-01 00:00:20 36580 sec" '+%T'
10:10:00

что-то среднее:

date --date "1970-01-01 00:00:20 $(shuf -n1 -i0-36580) sec" '+%T'

Связанный контент