題 使用FFmpeg從視頻文件中切換部分從開始位置到結束位置[複製]


這個問題在這裡已有答案:

我有一個30分鐘的視頻文件,但我想從00:09:23到00:25:33提取視頻。

我可以定義開始位置 -ss,但我找不到一個最終位置。有什麼幫助嗎?


121
2018-01-11 17:59


起源




答案:


安裝ffmpeg

確保你 下載最新版本的 ffmpeg,並且不要使用您的發行版附帶的那個(例如Ubuntu)。來自各種發行版的打包版本通常已過時,並且不會按預期運行。

要么 自己編譯

如何剪切視頻,無需重新編碼

用它來剪切視頻 [start] 對於 [duration]

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

這裡,選項意味著以下內容:

  • -ss 指定開始時間,例如 00:01:23.000 要么 83 (很快)
  • -t 指定剪輯的持續時間(相同格式)。
  • 最近 ffmpeg 還有一個標誌來提供結束時間 -to
  • -c copy 將第一個視頻,音頻和字幕比特流從輸入複製到輸出文件,而不對其進行重新編碼。這不會損害質量並使命令在幾秒鐘內運行。

請注意,對於較舊的ffmpeg版本,複製比特流時此命令可能不是幀精確的。

如何剪切視頻,無需重新編碼 - 準確的方法

如果你有一個舊的ffmpeg版本並且你想要幀精度,請改用:

ffmpeg -i in.mp4 -ss [start] -t [duration] -c copy out.mp4

但是,有一個缺點。必須對視頻進行解碼,直到達到隱含的位置 -ss,然後才開始復制比特流。這可能需要很長時間,特別是對於很長的視頻。

如何剪切視頻,重新編碼

如果你遺漏了 -c copy 選項, ffmpeg 將根據您選擇的格式自動重新編碼輸出視頻和音頻。要獲得高質量的視頻和音頻,請閱讀 x264編碼指南 和 AAC編碼指南, 分別。

例如:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4

如解釋 尋求與FFmpeg):使用時 -ss 之前 -i 在FFmpeg 2.1和更新版本上,當重新編碼視頻時(即不使用),搜索是幀精確的 -c copy)。所以你不必擔心放 -ss 後 -i 為了速度。


將結束點轉換為持續時間

如果你需要使用舊版本的 ffmpeg 並且不能使用 -to 選項,您可以創建入點和出點的編輯列表,並將它們轉換為具有持續時間的點。為此您可以使用 這個Ruby腳本 我寫道,它計算差異:

require "Time"
def time_diff(time1_str, time2_str)
  t = Time.at( Time.parse(time2_str) - Time.parse(time1_str) )
  (t - t.gmt_offset).strftime("%H:%M:%S.%L")
end

例如:

time_diff("00:09:23.000", "00:25:33.000")
=> "00:16:10.000" 

216
2018-01-11 21:02



在ubuntu 12:10,-c:v和-c:a不起作用。我不得不使用“-acodec copy和-vcodec copy”。 - Samuel Lampa
@Samuel然後你使用的是過時的版本,它甚至不是真正的FFmpeg,而是Libav fork。看到: stackoverflow.com/a/9477756/1109017 - slhck
謝謝你!如果你沒有指定持續時間,它會結束嗎? - Jeff
@Jeff是的! (最小字符) - slhck
@Prateek複製視頻比特流(而不是重新編碼)時,你只能剪切 關鍵幀。如果在第1,2和3秒有關鍵幀,但你想在第二個1.5處切割,那麼ffmpeg將等到第二個2開始切割之前。這使得它不准確。 - slhck


我想你現在可以使用以下命令。

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

看看也 ffmpeg Doc, 要么 這個維基頁面


18
2018-05-07 02:30



ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFile 更簡單的版本 - nwgat
我不得不使用 ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4 版本(帶 -copyts),否則切割不正確(開頭有黑屏)。謝謝你的第二個鏈接。 - Necronomicron
這很棒,我想要的最後一件事就是從端點計算持續時間。 - Tomasz Gandor
-to選項回答實際問的問題。其餘的答案要么是無禮的,要么是過時的。 - James Bowery


這是奇怪的,沒有人建議 trim  過濾

刪除除輸入的第二分鐘以外的所有內容:

ffmpeg -i INPUT -vf trim=60:120

只保留第一秒:

ffmpeg -i INPUT -vf trim=duration=1

刪除除第二個13到第二個58之外的所有內容:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT

8
2018-04-07 15:10



是的,不勝感激 trim 和 atrim。我通常在過濾時使用這些,但用戶應注意 過濾需要重新編碼。 - LordNeckbeard
你是我的英雄。我非常需要一個過濾器來做到這一點。 - fahadash


你可以使用這些 兩種適用於Windows和Linux的方法。

有兩種方法可以通過ffmpeg分割視頻文件。第一個本身就很好,不止於此 - 它更快,但有時會創建具有某些缺陷的輸出文件。因此,對於這些情況,存在第二種分割視頻文件的方式:它相當慢,輸出文件更大,但似乎它們始終與使用的輸入文件具有相同的質量水平。

方式1:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi

方式2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start>  - 視頻ffmpeg部分的開頭是要刪除。格式: 00:00:00.0000,表示小時:分鐘:秒:毫秒。

  • <duration>  - 視頻ffmpeg部分的持續時間將被刪除。格式與上述相同。

例子:

ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi

ffmpeg從1小時19分0秒開始刪除部分視頻文件。切出的視頻序列的持續時間是5分0秒。


3
2017-10-03 19:08



好吧,thnx。請查看文檔並明天試一試。 - juGGaKNot
-sameq 並不意味著“同樣的品質” 並已從ffmpeg中刪除。使用 -codec copy 代替。另外,別忘了 -to 選項。 - LordNeckbeard
我更正了你的報價中的命令,因為它們已經過時了。請勿在未正確引用的情況下複製粘貼信息。 - slhck


你可以用它

ffmpeg -sameq -ss clip_start -t duration  -i  original.ogg  clip.ogg

在這裡你必須給出視頻的持續時間。即。 00:25:33-00:09:23


-1
2018-01-11 18:29



正如我在另一個答案中提到的:使用您的命令,您將重新編碼文件,這絕對不是必需的,會導致質量下降和處理時間增加。 - slhck


我使用以下語法用ffmpef剪切視頻:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t用於設置持續時間(以秒為單位) - 您無法指定結束時間,但這應該適合您。


-2
2018-01-11 18:27



為什麼要設置FFmpeg來重新編碼文件?注意 -sameq 並不意味著“同樣的品質”。 - slhck