利用FFmpeg切割視頻

關鍵詞:FFmpeg,seek,ss,t,to,搜索,定位


介紹

若是你想要從輸入文件中切割一部分,須要用到ss選項。php

快速定位

須要將ss放在輸入文件的前面(即-i的前面ide

ffmpeg-ss 00:03:00 -i Underworld.Awakening.avi -frames:v 1 elesos1.jpg

11232683625_acb3f62819_o.jpg

上面的命令會將大約3分鐘處的畫面生成一幀, 這種基於關鍵幀的搜索會很是快,但缺點是隻能定位到關鍵幀,而不必定是指定的時間00:03:00,所以不太精確。spa

[編輯]精肯定位

須要將ss放在輸入文件的後面(即-i的後面3d

ffmpeg-i Underworld.Awakening.avi -ss 00:03:00 -frames:v 1 elesos2.jpg

11232683555_7cd1045f5c_o.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

11232683565_295af0bf3f_o.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是強制基於關鍵幀進行切割的。

[編輯]藝搜參考

http://trac.ffmpeg.org/wiki/Seeking%20with%20FFmpeg

相關文章
相關標籤/搜索