介紹
如果你想要從輸入文件中切割一部分,需要用到ss選項。
快速定位
需要將ss放在輸入文件的前面(即-i的前面)
ffmpeg-ss 00:03:00 -i Underworld.Awakening.avi -frames:v 1 elesos1.jpg
上面的命令會將大約3分鍾處的畫面生成一幀, 這種基於關鍵幀的搜索會非常快,但缺點是只能定位到關鍵幀,而不一定是指定的時間00:03:00,因此不太精確。
[編輯]精確定位
需要將ss放在輸入文件的后面(即-i的后面)
ffmpeg-i Underworld.Awakening.avi -ss 00:03:00 -frames:v 1 elesos2.jpg
上面的命令會精確地定位到3分鍾,並將該處的畫面生成一幀圖像。
注意上面2張圖片左下角的時間,第一張為"00:02:05:05" ,第2張為 "00:02:05:06".
輸入文件會一幀一幀地進行解碼直到到達ss所指定的位置,因此會非常慢。而且隨着指定時間越長,需要等待的時間也會越長。
[編輯]快速並且精確定位
需要在輸入文件前后同時指定ss參數
ffmpeg-ss 00:02:30-i Underworld.Awakening.avi -ss 00:00:30 -frames:v 1 elesos3.jpg
這種方法綜合了上面2種方法的優點。
首先快速定位到3分鍾之前的某個時間點,然后從該時間點開始一幀一幀地慢慢解碼到3分鍾。
FFmpeg會首先快速定位到00:02:30附近的關鍵幀處,然后開始慢慢往后搜索30秒。結果與“精確定位”相同(左下角也是00:02:05:06),但是速度更快。
對於上面2個ss時間點(00:02:30和00:00:30)的設置依賴於關鍵幀的間隔(即GOP的大小),
X264默認GOP大小為250(即如果輸入幀率為25fps,則每10秒一個關鍵幀)。
切割片斷
如果想要從中間切割一段視頻,可以將ss和t參數聯合使用,其中t參數指定時長,例如“-ss 60 -t 10”將切割一段從60秒到70秒的片斷;
或者使用to選項指定結束時間點,如“ -ss 60 -to 70”也一樣切割一段從60秒到70秒的片斷;選項t和to不能同時使用,如果你同時指定,默認會使用參數t。
[編輯]注意
如果你僅僅在輸入文件之前(-i之前)指定了ss選項,那么時間戳會被重置為0,此時選項t和選項to產生的效果一樣。
ffmpeg-ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy cut.mp4 ffmpeg-i video.mp4 -ss 00:01:00 -to 00:02:00 -c copy cut.mp4
上面例子中,第一個命令會得到從00:01:00 到 00:03:00的片斷,而第二個命令會真正得到從00:01:00 到 00:02:00的片斷。
如果你切割的時候使用了流拷貝stream copy (-c copy),並且想用 concat demuxer來合並你切割出來的片斷,你需要指定`-avoid_negative_ts 1`:
ffmpeg-ss 00:03:00 -i video.mp4 -t60-c copy -avoid_negative_ts 1 cut.mp4
[編輯]時間格式
你可以使用[HH:MM:SS]格式或者以秒為單位,如00:02:30 或者 150。如果你使用了小數,如02:30.05,小數點后面的05表示1秒*5%,即50毫秒(注:1秒=1000毫秒ms =106微秒µs)而不是幀數,如02:30.5表示2分鍾,30秒,500毫秒(即半秒)。
[編輯]附
如果將-c:v copy與-ss同時使用,生成的文件可能不能播放,或者出現音視頻不同步的問題,因為FFmpeg是強制基於關鍵幀進行切割的。