題 使用ffmpeg剪切視頻


我正在使用ffmpeg剪切出一個像這樣的大文件的一部分:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

-ss 部分工作正常但是 -t 被忽略了。它正確地刪除了指定的初始指定秒數 -ss 但隨後繼續使用副本進入輸入的末尾。

有沒有辦法使用ffmpeg切斷視頻的結尾而不重新編碼?


265
2018-05-06 14:12


起源


這個語法是正確的。 - jiggunjer
stackoverflow.com/questions/18444194/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


你可以使用 -ss 用於指定開始時間戳的選項,以及 -t 用於指定編碼持續時間的選項。時間戳需要在 HH:MM:SS.xxx 格式或秒(s.msec)。

以下將剪切前30秒,然後剪輯10秒後的所有內容:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

注意 -t 是輸出選項,始終需要指定   -i

一些技巧:

  • 對於較舊的ffmpeg版本,如果您使用 -ss 後 -i,你會以更慢的執行為代價獲得更準確的搜索。也可以看看: 尋求與FFmpeg
  • 您可以使用 -to 代替 -t 指定要剪切的時間戳。所以,而不是 -i <input> -ss 30 -t 10 你也可以這樣做 -i <input> -ss 30 -to 40 實現同樣的目標。

  • 如果你的ffmpeg不支持 -c, 要么 -to,它很可能已經過時了。 編譯新版本 你自己還是 下載靜態版本 從他們的主頁。這真的不復雜。


317
2018-05-15 00:03



@Mondain實際上,你可以更準確地把-ss放在後面。而slhck在這裡提到了這一點 blog.superuser.com/2012/02/24/...  同樣在ffmpeg文檔中,-ss它提到了在之前或之後放置它的區別。 - barlop
+1我來到這裡是為了弄清楚如何在前35秒後忽略一切,謝謝: ffmpeg -i input.wmv -c copy -t 35 output.wmv - karlphillip
這對我不起作用(mp4)。它只產生5秒黑屏: frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s - clocksmith
這在我的視頻剪輯的開頭產生了3-4秒的黑屏。克里斯的修改與省略 -c copy 刪除了最初的黑屏,詳細了解他的答案。 - joelostblom
你寫下“以下會剪掉前30秒,然後剪掉10秒後的所有內容:”< - 這是什麼意思?通過剪輯你的意思是包括? 'cos剪輯可能意味著剪輯。假設你的意思是包括。你的意思是從30秒開始,只包括10秒鐘?如果是這樣,那麼我建議你寫一下它會更清楚。 - barlop


正如其他人提到的,推桿 -ss 之前(快得多)或之後(更準確) -i 有很大的不同。 ffmpeg搜索頁面上的“快速準確的搜索”部分告訴您如何獲得兩者,並且我已經使用過它,它會產生很大的不同。基本上你放了 -ss 之前和之後 -i,只需確保留下足夠的時間,然後再開始切割以獲得另一個關鍵幀。例: 如果你想在Video.mp4中進行1分鐘的剪輯,從9min0sec到10min 0sec,你可以使用以下方法快速準確地完成:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

首先 -ss 尋求快速(大約)8min0sec,然後是第二次 -ss 準確地尋求到9min0sec,並且 -t 00:01:00 取出1min0sec的剪輯。

另請注意該頁面的重點:“如果您使用 -ss 同 -c:v copy,由於ffmpeg被強制僅在i幀上使用/分割,因此產生的比特流可能最終變得不連貫,無法播放或與音頻流不同步。

這意味著您需要對視頻進行重新編碼,即使您只想複製它,也不要冒險它不穩定且不同步。你可以嘗試一下 -c copy 首先,如果視頻很糟糕,你需要重新做。


78
2018-01-20 04:07



相同的警告適用於 -c:a copy 對於這種尋求方式。 - jiggunjer
最好的答案,這種方式對我來說是最好的。 - Ondra Žižka
似乎“-ss”現在在ffmpeg 2.1+中快速而準確,而沒有指定它兩次。 trac.ffmpeg.org/wiki/Seeking - Conrad Meyer


我找到 -ss 結合 -c copy 在開始時產生了半秒的印章。

為避免這種情況,您必須刪除 -c copy (誠然,它會進行轉碼)。


18
2018-05-09 02:24



另一個答案涉及準確性。使用默認選項重新編碼通常不是您想要做的! - Tomasz Gandor
好點@TomaszGandor - Chris
我根本不理解@ TomaszGandor的回复,但刪除了 -c copy 固定它。 - Iulian Onofrei


手動

在媒體播放器中打開文件,逐幀前進並播放 AVISynth文件 數據如:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

然後用EXACT時間格式剪切:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

現在使用包含以下內容的視頻文件製作一個txt文件:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

運行ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"

13
2017-09-04 05:48





為了我 -t 選項不起作用,但是 -vframes 工作。我更喜歡使用 #frames因為我寧願在I-Frames切割,而且我發現GOP用於視頻 ffprobe

對我有用的命令行是:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

順便說一句,推桿 -ss 在前面 -i 在執行時間上有很大的不同。


7
2018-05-19 03:14



其實 -vframes (要么 -frames:v)應該來之後 -i 因為它是一個輸出選項。 - slhck


與user225366一樣,-t選項不適用於短視頻,但適用於較長的視頻。對於短視頻,似乎-frames:v更好。這對我有用。

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

如果視頻有音頻,則需要添加-acodec副本,如其他答案所示。


3
2017-12-08 11:24