シェルスクリプトで数値を時間形式に変換するには?

シェルスクリプトで数値を時間形式に変換するには?

このように映像を10分程度に切りたいです。

ffmpeg -i video.mp4 -ss 00:00:00 -t 00:10:00 -c copy 01.mp4
ffmpeg -i video.mp4 -ss 00:10:00 -t 00:10:00 -c copy 02.mp4
ffmpeg -i video.mp4 -ss 00:20:00 -t 00:10:00 -c copy 03.mp4

それではforそうなります。

for i in `seq 10`; do ffmpeg -i video.mp4 -ss 00:${i}0:00 -t 00:10:00 -c copy ${i].mp4; done;

ただし、持続時間が1時間未満の場合にのみ機能します。 bashシェルで数値を時間形式に変換するには?

ベストアンサー1

BASHはこの問題に悪くはありません。非常に強力ですが、使用率の低いコマンドを使用する必要がありますdate

for i in {1..10}; do
  hrmin=$(date -u -d@$(($i * 10 * 60)) +"%H:%M")
  outfile=${hrmin/:/-}.mp4
  ffmpeg -i video.mp4 -ss ${hrmin}:00 -t 00:10:00 -c copy ${outfile}
done

date命令の説明

date-d設定できるフラグ付きどの表示する日付(デフォルトの現在の日付と時刻の代わりに)。この例では、@整数の前に記号を追加してUNIX時間に設定しました。この例の整数は10分あたりの時間です(BASHに組み込まれた計算機で計算:)$((...))

この+記号は、date結果が表示される形式を指定したいことを示します。私たちの場合、時間(%H)と分()にのみ興味があります%M

最後に、-u現地時間ではなくUTC時間が表示されます。この場合、UNIX時間を指定したときに時間をUTCとして指定したため、これは重要です(UNIX時間は常にUTCです)。 1つを指定しないと、数字が0から始まらない可能性があります-u

BASH変数の代替説明

このdateコマンドは私たちに必要なものを提供します。ただし、ファイル名のコロンは問題があるか、標準ではない可能性があります。したがって、「:」を「-」に置き換えます。これはsedorcutコマンドを使用して行うことができますが、trこれは非常に簡単な作業なので、BASHで行うことができますが、なぜ新しいサブシェルを作成するのですか?

ここでは、BASHの単純な式の置き換えを使用します。これを行うには、変数を中括弧(${hrmin})で囲み、標準のスラッシュ表記に従う必要があります。最初のスラッシュの後の最初の文字列は検索パターンです。 2番目のスラッシュの後の2番目の文字列は代替文字列です。

BASH変数の置換などは以下にあります。http://tldp.org/LDP/abs/html/parameter-substitution.html

おすすめ記事