posts - 11,  comments - 0,  views - 663
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

moviepy==1.0.2

正常画中画

#画中画
from moviepy.editor import VideoFileClip, CompositeVideoClip
from moviepy.video.fx.resize import resize

main_clip = VideoFileClip("1222.mp4")  # 主要视频
pip_clip = VideoFileClip("122.mp4")  # 画中画视频


pip_clip = resize(pip_clip, width=300)
pip_clip = pip_clip.set_position(("right", "bottom")).set_duration(main_clip.duration)


final_clip = CompositeVideoClip([main_clip, pip_clip])
final_clip.write_videofile("output_video.mp4", codec="libx264", fps=24)

圆形画中画

# 画中画圆形视频🆗
from moviepy.editor import VideoFileClip, CompositeVideoClip, ImageClip
import numpy as np
from moviepy.video.fx.resize import resize
# 创建圆形遮罩的函数
def create_circular_mask(width, height):
    """
    创建圆形遮罩,返回一个圆形区域为白色,背景为透明的遮罩图像
    """
    mask = np.zeros((height, width), dtype=np.uint8)
    center = (width // 2, height // 2)
    radius = min(center)

    # 填充圆形区域为白色(显示部分)
    y, x = np.ogrid[:height, :width]
    mask_area = (x - center[0]) ** 2 + (y - center[1]) ** 2 <= radius ** 2
    mask[mask_area] = 255
    return mask

# 裁剪视频并合成画中画的函数
def create_pip_video(pip_video_path, background_video_path, pip_position=(0, 0), pip_size=None, output_path="output_video_with_circular_pip.mp4"):
    """
    裁剪 pip_video 为圆形并将其合成到背景视频上,形成画中画效果
    :param pip_video_path: 要裁剪的画中画视频文件路径
    :param background_video_path: 背景视频文件路径
    :param pip_position: 画中画视频的位置,元组 (x, y)
    :param pip_size: 画中画视频的目标大小,元组 (width, height),可选
    :param output_path: 输出视频文件路径
    """
    # 加载 pip 视频文件
    pip_video = VideoFileClip(pip_video_path)

    # 如果指定了 pip_size,则调整 pip_video 的大小
    if pip_size:
        pip_video = resize(pip_video,newsize=pip_size)

    # 获取调整后的视频大小
    width, height = pip_video.size

    # 创建圆形遮罩
    mask = create_circular_mask(width, height)

    mask_3d = np.stack([mask] * 3, axis=-1)  # 将二维mask转换为三维

    # 将视频裁剪为圆形并设置透明背景
    mask_clip = ImageClip(mask_3d).set_duration(pip_video.duration).set_fps(pip_video.fps).to_mask()

    # 为视频设置遮罩
    pip_video_with_mask = pip_video.set_mask(mask_clip)
    background_video = VideoFileClip(background_video_path)
    final_video = CompositeVideoClip([background_video, pip_video_with_mask.set_position(pip_position)])
    final_video.write_videofile(output_path, codec="libx264", fps=background_video.fps)

# 调用函数,传入视频路径和参数
create_pip_video(
    "122.mp4",
    "1222.mp4",
    pip_position=(450, 950),
    pip_size=(250, 300),  # 调整画中画视频的大小
    output_path="output_video_with_circular_pip.mp4"
)
posted on   msms123  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示