
我的要求如下:
- 輸入影片是 MP4
- 疊加可以是 gif 或 png。
疊加應出現在輸入影片的時間戳記上。它應該持續 5 秒。如果是 gif,則應循環播放 5 秒。在覆蓋出現的這 5 秒內,背景影片應暫停(音訊和視訊),然後在覆蓋消失後恢復。疊加可以發生在從第 0 幀到最後一幀的任何位置。
我嘗試過在時間戳處插入圖像,計算該時間戳處的幀,然後使用loop
,但我遇到了一個或另一個問題,無論是音訊還是視訊。我還嘗試在疊加時將視訊分成兩部分,應用到一個部分然後合併它們。
我在過去的三天裡一直在做這件事,希望有人能幫我完成這個命令,因為目前我無法做到這一點。
答案1
呃,我花了好幾個小時才把這件事做好。 @Баяр Гончикжапов 的評論和本主題的答案有所幫助:https://stackoverflow.com/questions/43414641/repeat-last-frame-in-video-using-ffmpeg
您必須在覆蓋之前的部分上使用 tpad 過濾器,這樣您就可以根據需要暫停該部分的最後一幀。接下來,您將填充第 1 部分的音頻,以補償視頻暫停時的額外時間並使用 apad 過濾器顯示疊加層。
繼續,您連接視訊部分+音訊部分,並在產生的視訊上套用疊加。
作為範例,我將使用 30 秒的第 1 部分,然後疊加暫停 5 秒,第 2 部分也使用 30 秒。
對於 png 影像:
ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -i apple.png -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_png.mp4"
對於 gif 圖像:
ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -stream_loop -1 -i horse.gif -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_gif.mp4"