変数を使用して、bash スクリプトで多少ランダムな拍子を生成したいと考えています。長さが 11 時間のビデオ ファイルがあり、ほとんどの平日にダウンロードする 50 分の mp3 ポッドキャストを、のffmpeg
-shortest オプション (ビデオを非常に短いオーディオの長さにトリミングする) を使用してビデオと多重化します。そのため、ビデオの終了の 50 分前までに、毎日ランダムな時点でオーディオをビデオに挿入したいと考えています。
これまで私が考え出したのは、date
およびshuf
コマンドを利用することです。 を使用してshuf
、36305 から 72850 の間のランダムな 5 桁の文字列を生成し、それをdate
次のように入力します。
date --date="$(shuf -i 36305-72850 -n 1) sec ago" +%T
(5 桁の文字列は、10:10 AM からその前の深夜までの範囲内 (秒単位) にあります。10 AM は 36305 秒前、深夜はスクリプト実行の 72805 秒前です)。これは必要なタイム スタンプを生成するのにうまく機能しているようですが、タイム スタンプを生成するよりエレガントで最適な別の方法があるのではないかと思います。
助言がありますか?
説明
ffmpeg
私が生成しようとしている半ランダムなタイムスタンプは、スイッチを使用して入力されるもので-ss
、コロンで区切られ、時間追跡規則に準拠した 3 つの数値連桁の形式を取る必要があります (このクエリに関連する実用的な目的のために、連桁の数値制限は、最初の連桁が 0 ~ 24、次の 2 つが 0 ~ 60 ですが、私の使用法では、最初の連桁は 0 ~ 10、2 番目の連桁は最初の連桁が 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'