
我有一個 3:00 分鐘的短片,中間僅從左向右翻轉約 :30 秒。
因此,如果整件事情從左到右翻轉,我只想申請:
ffmpeg -i 3min.mp4 -vf hflip flipped_3min.mp4
但由於它只是部分翻轉,因此有沒有辦法在單一 ffmpeg 命令中為該 hflip 過濾器應用時間段(1:30-2:00)?
我正在尋找一些關於此的文檔,但找不到任何類似的東西,我想知道這在 FFmpeg 中是否不可能。
答案1
如何使用 只翻轉影片的一小部分ffmpeg
?
這裡,-filter_complex
是你的朋友,因為它可以創建過濾輸入鏈。我們仍將使用hflip
過濾圖中問題中提到的過濾器。
您可以像這樣申請一個小節:
ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];\
[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];\
[b]hflip[c];\
[a][c]concat[d];\
[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];\
[d][e]concat[out1]" -map [out1] flip.mp4
一行即可輕鬆複製+貼上:
ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];[b]hflip[c];[a][c]concat[d];[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];[d][e]concat[out1]" -map [out1] flip.mp4
解釋:
使用過濾器圖表有點像創建一系列操作,並且在“過濾簡介”部分過濾器文檔。過濾器與輸入- 這是您在過濾器之前看到的位,例如[0:v]
(第一個輸入流的視頻)或[a]
(名為 的創建的輸出a
) - 以及輸出。也就是說,一個輸入或者輸入根據 a 進行變換filter
,然後輸出為 a輸出或者輸出。
我們這裡有一組簡單的操作,如果我們按順序執行這些操作,我們可以建立輸入和輸出的過濾圖。
段
使用以下指令建立 3 個影片片段(來自輸入[0:v]
)trim
:
- 第一段(90 秒),不執行任何操作(輸出為
[a]
) - 第二段(30 秒),
hflip
並setpts
避免持續時間問題(輸出修剪 as[b]
並將其傳遞到hflip
輸出 as[c]
)
然後將這兩者concat
組合在一起以產生輸出[a]+[c] -> [d]
(持續時間:120 秒)
- 第三段(60秒),再次設定PTS(輸出為
[e]
)
連接段以產生輸出[d] + [e] -> [out1]
,並將-map
其新增至檔案中的最終輸出。
這將為您提供與原始影片相同的持續時間(180 秒),但中間有 30 秒的部分,水平翻轉2。
1:
視覺表現來自ffmpeg
過濾器文檔
在 中
libavfilter
,過濾器可以有多個輸入和多個輸出。為了說明可能發生的事情,我們考慮以下過濾圖。
[main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+
此過濾器圖將輸入流分成兩個流,然後透過裁剪過濾器和 vflip 過濾器發送一個流,然後透過將其覆蓋在頂部將其與另一個流合併回來。
2測試使用ffmpeg version N-72939-g5b0f55a
答案2
一些過濾器透過以下方式提供時間軸支持啟用選項。
您可以查看過濾器列表以及它們是否具有時間軸支援ffmpeg -filters
。過濾器名稱前面的“ T
”表示它支援時間軸編輯。如果您所需的過濾器沒有時間軸支持,請更新您的ffmpeg
過濾器,因為過濾器有時會更新以支援此功能。否則,請按照其他答案中的說明使用修剪過濾器。
ffmpeg
例子:
ffmpeg -i input -vf "hflip=enable='between(t,90,120)'" -c:a copy output
ffplay
例子:
ffplay -vf "hflip=enable='between(t,90,120)'" input