FFMpeg :在影片保持暫停狀態時將影像或 gif 疊加在影片上 X 秒

FFMpeg :在影片保持暫停狀態時將影像或 gif 疊加在影片上 X 秒

我的要求如下:

  1. 輸入影片是 MP4
  2. 疊加可以是 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"

相關內容