将 png 以透明方式淡入 mp4 视频

将 png 以透明方式淡入 mp4 视频

我正在尝试将具有透明度的 png 文件叠加到 mp4 视频中

原始视频为 20 秒,我想将原始视频的 00:10 到 00:20 之间的透明 png 叠加,并以 00:10 - 00:14 淡入。

     0s                                10s      14s                       20s
video |---------------------------------+--------+-------------------------|
png   | . . . . . . . . . . . . . . . . +========+-------------------------|
                                        |        |                         |
                    start png fade-in _/         |                         |
                                                 |                         |
                                end png fade-in _/                         |
                                                     end of .png overlay _/

我无法创建 png 淡入效果。我尝试使用以下方法创建透明 mov

ffmpeg -loop 1 -i file.png -frames:v 300 -vf 'fade=in:0:120' \
           -pix_fmt rgba -vcodec png  output.mov

并将两个文件合并为

../ffmpeg -y -i video.mp4 -i output.mov -filter_complex \
            "[0:v][1:v] overlay=170:150:enable='between(t,10,20)'" final.mp4

但最终的视频会瞬间显示动画,而不会淡入淡出。

我是否遗漏了什么?

先感谢您,

答案1

您不需要将创建覆盖 mov 作为单独的步骤。

首先创建覆盖就像电影一样这样:

-loop 1 -i 水印.png

然后使用淡入淡出滤镜淡入 4 秒(即 100 帧):

淡入淡出:0:100

然后将其延迟 10 秒以便稍后启动:

设置点=PTS-STARTPTS+10/TB

你的命令就变成:

ffmpeg -i video.mp4 -loop 1 -i watermark.png -filter_complex \  
"[1:v]fade=in:0:100[v1]; [0:v]setpts=PTS-STARTPTS[v0];  \  
[v1]setpts=PTS-STARTPTS+10/TB[v3];[v0][v3]overlay=eof_action=pass[out1]"  \  
-map [out1] <other parameters> overlaidoutput.mp4

叠加将持续到最后。当然,你可以在“其他参数“ 部分。

笔记:我使用了 100 帧,持续 4 秒,因为我使用的是 PAL 25 fps。如果您使用 30 fps,则可以将其更改为 120 帧。


如果需要在特定时间点结束叠加,也可以使用参数enable

ffmpeg -i video.mp4 -loop 1 -i watermark.png -filter_complex \  
"[1:v]fade=in:0:100[v1]; [0:v]setpts=PTS-STARTPTS[v0];  \  
[v1]setpts=PTS-STARTPTS+10/TB[v3];  \  
[v0][v3]overlay=enable='between(t,10,12)':eof_action=pass[out1]"  \  
-map [out1] <other parameters> overlaidoutput.mp4  

覆盖将在 12 秒后结束。确保您使用的是 ffmpeg 版本 2 或更高版本。

答案2

我建议使用这个艾维合成脚本:

LoadPlugin("AviSynth+/plugins/ffms2-2.23.1-msvc/x86/ffms2.dll")
video = FFmpegSource2("video.mp4", atrack=1)
vseg1 = video.Trim(0, 419)
vseg2 = video.Trim(420, 599)
iseg1 = ImageSource("file.png", end=119, fps=30)
iseg2 = ImageSource("file.png", end=179, fps=30)
clip1 = Dissolve(vseg1, iseg1, 120)
clip2 = Overlay(vseg2, overlay=iseg2, x=170, y=150, mask=iseg2.ShowAlpha("RGB32"))
clip1 + clip2

然后:

ffmpeg.exe -i 脚本.avs -c:v libx265 -pass 1 -c:a aac -f mp4 -n 输出.mp4

警告:代码只是一个存根;未测试

相关内容