![将 png 以透明方式淡入 mp4 视频](https://linux22.com/image/1433605/%E5%B0%86%20png%20%E4%BB%A5%E9%80%8F%E6%98%8E%E6%96%B9%E5%BC%8F%E6%B7%A1%E5%85%A5%20mp4%20%E8%A7%86%E9%A2%91.png)
我正在尝试将具有透明度的 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
警告:代码只是一个存根;未测试!