但由於 FFmpeg 主要由指令組成,對於現今 GUI 當道的作業系統, FFmpeg 便顯示非常難操作
而且部分選項並不人性化,操作上便更加困難
FFmpeg 可以在轉換前,先利用 -i 選項觀察媒體檔案的資訊
1 | ffmpeg -i video |
但 FFmpeg 的資訊輸出是以 standard error 輸出,因此以
1 | ffmpeg -i video >video.info |
需要使用
1 | ffmpeg -i video 2>video.info |
若果不想將輸出至檔案,可以使用
1 | ffmpeg -i video 2>&1 |
當正常輸出後便可以將資訊利用不同的指令或程式分析
例如媒體檔案播放時間長度
FFmpeg 會以 Duration: HH:MM:SS.ss 的方式顯示,例如
1 | Duration: 01:23:45.67, start: 0.000000, bitrate: 1200 kb /s |
1 | ffmpeg -i video 2>&1 | grep -e 'Duration' | awk '{print $2}' | tr -d ',' |
| grep -e 'Duration' 利用 pipe 將 standard out 給予 grep 並只接收資訊中包含 Duration 字串的行(理論上只有1行)
| awk '{print $2}' 利用 pipe 將 standard out 給予 awk 以空白作為分隔器,並截取第2組字串(不包含空字串),即 01:23:45.67,
| tr -d ',' 利用 pipe 將 standard out 給予 tr 將截取到的字串的 , (逗號) 移除,便可以完整地只輸出播放時間長度
FFmpeg 只能使用 -t 或 -vframe 截取長度選項,沒有截取結束時間的選項
若需要截取影片 00:01:00.00 至 00:05:00.00 的範圍,便需要計算 00:05:00.00 減 00:01:00.00 的長度
00:05:00.00 減 00:01:00.00 是 00:04:00.00 當然易計,但時間長度並不一定如此簡單計算
雖然 Shell Script 有運算能力,但時間格式不能相減,因此要先將時間格式轉換成普通整數值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | eraseZeros(){ echo "${1}" | sed 's/^0*//' } timeToInt(){ time = "${1}" HH= "${time:0:2}" HH=`eraseZeros $HH` MM= "${time:3:2}" MM=`eraseZeros $MM` SS= "${time:6:2}" SS=`eraseZeros $SS` ss= "${time:9:2}" ss=`eraseZeros $ss` echo $(((HH*3600+MM*60+SS)*100+ss)) } |
因此要將 前置 0 刪除,以確保數值以正常既 十進制 運算,如 01:23:45.67 會轉換成 502567 便可以進行運算
例如要截取 01:23:45.67 至 02:34:56.78 之間的影片,可以
1 2 3 | start=`timeToInt 01:23:45.67` end=`timeToInt 02:34:56.78` hectoSecond=$((end-start)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | padZero(){ printf "%02d" $1 } intToTime() ss= "${1}" HH=$((ss /360000 )) HH=`padZero $HH` ss=$((ss%360000)) MM=$((ss /6000 )) MM=`padZero $MM` ss=$((ss%6000)) SS=$((ss /100 )) SS=`padZero $SS` ss=$((ss%100)) ss=`padZero $ss` echo "${HH}:${MM}:${SS}.${ss}" } |
1 | duration=`intToTime $hectoSecond` |
1 2 3 4 5 6 7 | start_time=<start_time> end_time=<end_time> start_int=`timeToInt $start_time` end_int=`timeToInt $end_time` duration_int=$((end_int-start_int)) duration_time=`intToTime $duration_int` ffmpeg -i video -ss $start_time -t $duration_time [other options] output.avi |
沒有留言 :
張貼留言