ffmpegの出力は邪魔なので今まで捨ててましたが、進捗率が表示できるという記事を見つけたので、それを参考に加工してみました。
個人的には、いつ頃終わるか分かるようになったのが良かったです。
使い方
パイプでawkに渡してください。
shell
$ ffmpeg -i <入力ファイル> <出力ファイル> | awk -f progress.awk
パイプを使うので、$?
でステータスが取れなくなります。
$[PIPESTATUS[0]]
などで拾ってください。
呼び出されるスクリプト
gawk 前提です。5% 進むごとに表示します。
progress.awk
BEGIN{RS="frame="}
/Duration: /{
match($0, /[0-2][0-3]:[0-5][0-9]:[0-5][0-9]/)
TIME=substr($0, RSTART, RLENGTH)
split(TIME, array, ":")
Dura=array[1]*3600+array[2]*60+array[3]
Start=systime()
Old=-1
}
/time=/{
match($0, /[0-2][0-3]:[0-5][0-9]:[0-5][0-9]/)
Now=substr($0, RSTART, RLENGTH)
split(Now, array1, ":")
Prog=array1[1]*3600+array1[2]*60+array1[3]
Ratio=int(Prog/Dura*100)
if ( Ratio != Old ) {
if ( Ratio % 5 == 0 ) {
Current=systime()
px=Current-Start
Remain=""
if ( Prog != 0 ) {
rx=(Dura*px)/Prog-px
Remain=sprintf(" 予測残: %02d:%02d:%02d", int(int(rx)/3600), int(int(rx)/60)%60, int(rx)%60)
}
printf (" 全体: %s 進捗: %s 進捗率: %3d%% 経過: %02d:%02d:%02d%s\n", TIME, Now, Ratio, int(int(px)/3600), int(int(px)/60)%60, int(px)%60, Remain)
system("")
}
Old=Ratio
}
}
実行結果
実行結果はこんな感じです。
実行結果
全体: 00:30:08 進捗: 00:00:00 進捗率: 0% 経過: 00:00:00
全体: 00:30:08 進捗: 00:01:31 進捗率: 5% 経過: 00:03:58 予測残: 01:14:50
全体: 00:30:08 進捗: 00:03:01 進捗率: 10% 経過: 00:08:08 予測残: 01:13:06
全体: 00:30:08 進捗: 00:04:32 進捗率: 15% 経過: 00:12:22 予測残: 01:09:50
全体: 00:30:08 進捗: 00:06:02 進捗率: 20% 経過: 00:16:41 予測残: 01:06:38
・
・
・
それぞれの項目の意味は次のとおり
- 全体
- 動画全体の長さ
- 進捗
- どこまで変換したか
- 進捗率
- 率で表したもの
- 経過
- 経過時間
- 予測残
- あとどれくらいで終わるかの予測値
参考にしたサイト