若是你想要從輸入文件中切割一部分,須要用到ss選項。php
須要將ss放在輸入文件的前面(即-i的前面)ide
ffmpeg-ss 00:03:00 -i Underworld.Awakening.avi -frames:v 1 elesos1.jpg
上面的命令會將大約3分鐘處的畫面生成一幀, 這種基於關鍵幀的搜索會很是快,但缺點是隻能定位到關鍵幀,而不必定是指定的時間00:03:00,所以不太精確。spa
須要將ss放在輸入文件的後面(即-i的後面)3d
ffmpeg-i Underworld.Awakening.avi -ss 00:03:00 -frames:v 1 elesos2.jpg
上面的命令會精確地定位到3分鐘,並將該處的畫面生成一幀圖像。orm
注意上面2張圖片左下角的時間,第一張爲"00:02:05:05" ,第2張爲 "00:02:05:06".視頻
輸入文件會一幀一幀地進行解碼直到到達ss所指定的位置,所以會很是慢。並且隨着指定時間越長,須要等待的時間也會越長。圖片
須要在輸入文件先後同時指定ss參數get
ffmpeg-ss 00:02:30-i Underworld.Awakening.avi -ss 00:00:30 -frames:v 1 elesos3.jpg
這種方法綜合了上面2種方法的優勢。同步
首先快速定位到3分鐘以前的某個時間點,而後從該時間點開始一幀一幀地慢慢解碼到3分鐘。it
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是強制基於關鍵幀進行切割的。