簡體   English   中英

如何將 gizeh 矢量動畫疊加到具有透明度的電影視頻上?

[英]How do I overlay a gizeh vector animation onto a moviepy video with transparency?

我無法弄清楚如何將 gizeh 動畫疊加到視頻上,以便矢量圖形可見但背景是透明的,因此視頻在動畫下方可見。 我嘗試了很多不同的方法,但似乎沒有任何效果。 我得到的只是完全隱藏底層視頻的 gizeh 動畫。

這是我最近的努力,只是試圖在視頻上畫一條紅線,我嘗試使用mask_color方法創建一個使用 Surface bg_c​​olor 的蒙版,但它沒有任何效果。

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))

如何定義和應用動畫圖形剪輯的蒙版?

moviepy 和 gizeh 的作者 Zulko 非常好心地幫助我找到了解決方案(完整的細節在這里https://github.com/Zulko/moviepy/issues/898 )。

訣竅是:

  • 對圖形和動畫使用相同的make_frame函數。
  • 使用transparent=True選項返回 numpy 圖像數組,它返回 RGB 值之后每個像素的不透明度值 [因此數組的形狀是 (width, height, 4)]
  • 對於蒙版剪輯,對數組進行切片,使其僅使用不透明度值 [給出形狀為 (width, height, 1)]
  • 對於圖形剪輯,對數組進行切片,使其僅使用 RGB 值 [給出形狀為 (width, height, 3)]
  • 將蒙版剪輯應用到圖形剪輯

工作代碼如下所示:


    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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM