我想使用变量在 bash 脚本中生成稍微随机的拍号。我有一个 11 小时长的视频文件,我将使用 's -shortest 选项将我在大多数工作日下载的 50 分钟 mp3 播客与视频混合在一起ffmpeg
(这会将视频的长度修剪为最短的长度)较短的音频)。因此,我希望每天在不晚于视频结束前 50 分钟的随机时间点将音频插入视频中。
到目前为止我所想出的利用了date
和shuf
命令。使用shuf
我生成一个介于 36305 和 72850 之间的随机 5 位字符串,并将其输入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——不过就我的使用而言,如果第一对联是 10,那么第一对联应该是 0-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 分钟的时间跨度,在此期间我可以半随机地选择一个开始时间,开始将音频混合到视频中。
希望这个澄清有帮助。顺便说一句,我比我提议的更喜欢弗雷迪的咒语,所以我可能会改用它。
答案1
我没有得到你通过你的date
命令得到的东西,所以我可能完全错误地了解你想要的东西。
要使用 GNU 生成 00:00:20 到 10:10:00 之间的时间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'