我不知道如何将gizeh动画叠加到视频上,以便可以看到矢量图形,但是背景是透明的,因此可以在动画下方看到视频。我尝试了许多不同的方法,但似乎没有任何效果。我所能得到的是gizeh动画完全隐藏了基础视频。
这是我最近的工作,只是尝试在视频上画一条红线,我尝试使用mask_color
vfx方法创建使用Surface bg_color的蒙版,但它没有任何效果。
import gizeh
from moviepy.editor import *
def make_frame(t):
surface = gizeh.Surface(width=720, height=1280, bg_color=(0.5, 0.5, 0))
line = gizeh.polyline(points=[(0, 1180), (720, 1180)], stroke_width=3, stroke=(1, 0, 0))
line.draw(surface)
return surface.get_npimage()
original_clip = VideoFileClip("test_original_video.mp4")
graphics_clip = VideoClip(make_frame, duration=original_clip.duration)
masked_graphics_clip = vfx.mask_color(graphics_clip, [0.5, 0.5, 0])
final_clip = CompositeVideoClip(
[original_clip,
graphics_clip],
size=(720, 1280))
final_clip.write_videofile("test_output_video.mp4", fps=30))
如何定义和应用动画图形剪辑的蒙版?
答案 0 :(得分:0)
moviepy和gizeh的作者祖尔科非常乐意帮助我找到解决方案(此处的详细信息https://github.com/Zulko/moviepy/issues/898)。
诀窍是:
make_frame
函数。transparent=True
选项返回numpy图像数组,该选项将在RGB值之后为每个像素返回不透明度值[因此,数组的形状为(width,height,4)] 工作代码如下:
import gizeh
from moviepy.editor import *
def make_frame(t):
surface = gizeh.Surface(width=720, height=1280)
line = gizeh.polyline(points=[(0, 1180), (720, 1180)], stroke_width=10, stroke=(1, 0, 0))
line.draw(surface)
return surface.get_npimage(transparent=True)
original_clip = VideoFileClip("test_original_video.mp4")
graphics_clip_mask = VideoClip(lambda t: make_frame(t)[:, :, 3] / 255.0,
duration=original_clip.duration, ismask=True)
graphics_clip = VideoClip(lambda t: make_frame(t)[:, :, :3],
duration=original_clip.duration).set_mask(graphics_clip_mask)
final_clip = CompositeVideoClip(
[original_clip,
graphics_clip],
size=(720, 1280)
)
final_clip.write_videofile("test_output_video.mp4", fps=30)