Я хочу сгенерировать несколько случайный размер такта в скрипте 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'