我想使用变量在 bash 脚本中生成一个有点随机的时间签名。我有一个长达 11 小时的视频文件,我将使用ffmpeg
's -shortest 选项(这会将视频修剪为较短的音频)。因此,我希望每天在视频结束前不迟于 50 分钟的随机点将音频插入视频中。
到目前为止,我提出的方法是使用date
和shuf
命令。使用shuf
I 在 36305 和 72850 之间生成一个随机的 5 位字符串,并将其输入date
如下:
date --date="$(shuf -i 36305-72850 -n 1) sec ago" +%T
Run Code Online (Sandbox Code Playgroud)
(5 位字符串在范围内,以秒为单位,一方面是上午 10:10 之间,另一方面是前一个午夜,另一方面 - 上午 10 点是 36305 秒,午夜是我的脚本运行前的 72805 秒) . 这似乎可以很好地生成所需的时间戳,但我怀疑有其他方法可以生成更优雅和/或最佳的时间戳。
有什么建议?
澄清
我试图生成的半随机时间戳是ffmpeg
使用-ss
switch 的东西,并且必须采用由冒号分隔的 3 个数字对联的形式,并符合时间跟踪约定(出于与此查询相关的实际目的对联的限制是第一个对联为 0-24,第二个为 0-60--尽管对于我的用法,第一个对联应该是 0-10,如果第一个对联是 10,则第二个应该是 0-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 分钟的跨度内,半随机选择一个开始时间,我可以开始将音频混合到视频中。
希望这个澄清有帮助。顺便说一句,我比我提议的更喜欢 Freddy 的咒语,所以我可能会改用它。
我没有得到你通过你的date
命令得到的东西,所以我可能完全错误地了解你想要的东西。
要使用 GNU 生成 00:00:20 到 10:10:00 之间的时间date
,您可以执行以下操作:
开始时间:
$ date --date "1970-01-01 00:00:20" '+%T'
00:00:20
Run Code Online (Sandbox Code Playgroud)
结束时间(36580秒后):
$ date --date "1970-01-01 00:00:20 36580 sec" '+%T'
10:10:00
Run Code Online (Sandbox Code Playgroud)
介于两者之间的东西:
date --date "1970-01-01 00:00:20 $(shuf -n1 -i0-36580) sec" '+%T'
Run Code Online (Sandbox Code Playgroud)