![ffmpeg——如何将一个 PNG 叠加在另一个 PNG 上?](https://linux22.com/image/1522932/ffmpeg%E2%80%94%E2%80%94%E5%A6%82%E4%BD%95%E5%B0%86%E4%B8%80%E4%B8%AA%20PNG%20%E5%8F%A0%E5%8A%A0%E5%9C%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%20PNG%20%E4%B8%8A%EF%BC%9F.png)
我有带 alpha 层的 PNG A
,我想将其叠加在另一个 PNG 之上B
。如何使用 来实现ffmpeg
?
我试过了ffmpeg -i A.png -i B -filter_complex "[0:v][1:v] overlay=0:0" out.png
,但我只看到B
。
以下是命令输出。
> frame= 1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A
> speed=0.0883x video:2169kB audio:0kB subtitle:0kB other streams:0kB
> global headers:0kB muxing overhead: unknown ffmpeg version
> N-83044-g2a293ec Copyright (c) 2000-2017 the FFmpeg developers built
> with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3) configuration:
> --prefix=/data/local/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/data/local/ffmpeg_build/include
> --extra-ldflags=-L/data/local/ffmpeg_build/lib --bindir=/data/local/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree libavutil 55. 43.100 / 55. 43.100 libavcodec 57. 72.100 / 57. 72.100 libavformat 57. 62.100 / 57. 62.100 libavdevice 57. 2.100 / 57. 2.100 libavfilter 6. 68.100 /
> 6. 68.100 libswscale 4. 3.101 / 4. 3.101 libswresample 2. 4.100 / 2. 4.100 libpostproc 54. 2.100 / 54. 2.100 Input #0, png_pipe, from '/data/output/067_90.png':
> Duration: N/A, bitrate: N/A
> Stream #0:0: Video: png, rgba(pc), 2560x1440, 25 tbr, 25 tbn, 25 tbc Output #0, image2, to
> '/data/output/067_90_down2.png':
> Metadata:
> encoder : Lavf57.62.100
> Stream #0:0: Video: png, rgba, 1280x720, q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
> Metadata:
> encoder : Lavc57.72.100 png Stream mapping: Stream #0:0 -> #0:0 (png (native) -> png (native)) Press [q] to stop, [?] for help frame= 1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A
> speed=0.163x video:134kB audio:0kB subtitle:0kB other streams:0kB
> global headers:0kB muxing overhead: unknown
答案1
如果要将 A 叠加在 B 之上,则需要切换文件输入顺序或叠加摄取顺序。
ffmpeg -i B.png -i A.png -filter_complex "[1]scale=iw/2:-1[b];[0:v][b] overlay" out.png
答案2
这个答案不是使用ffmpeg然而...(我尝试实现相同功能但使用大量图像并输出到视频文件)但是...
使用转变和合成的命令来自图像魔法可以提供帮助,结果是动画 gif、mpeg 或单个图像。
这将创建一个带有“覆盖”的动画 gif:
convert -delay 100 -loop 0 *.png test.gif
这将生成一个 mpeg 文件:
convert *.png test.mpeg
(无论如何,对于 mpeg 文件转变还运行 ffmpeg :)
要从多个输入文件中写入叠加图像文件,您可以使用合成的命令来自图像魔法:
composite -gravity center a.png b.png out.png
这覆盖png(例如背景)一个.png(例如前景)保持透明度。输出写入出.png
或者使用更多输入图像,最后一个是输出图像:
composite -gravity center a.png b.png c.png out.png
答案3
指定编解码器和例如,支持 alpha 格式-c:v png -pix_fmt rgba
。要查看您拥有哪些编解码器,ffmpeg -codecs
。要查看您拥有哪些格式,ffmpeg -pix_fmts
。