使用python处理视频的库moviepy

385 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

moviepy能干啥

  • moviepy可以一行代码快速剪辑视频中某个区间的片段
  • moviepy可以合并多个视频为一个
  • moviepy可以给视频添加字幕
  • moviepy可以给视频添加水印
  • moviepy可以对视频进行裁剪

moviepy是啥

moviepy是一个第三方的python库,开源,且是跨平台的;有自己的官网地址:中文文档在这里:中文文档

文档解释:MoviePy是一个用于视频编辑的Python模块,它可被用于一些基本操作(如剪切、拼接、插入标题)、视频合成(即非线性编辑)、视频处理和创建高级特效。它可对大多数常见视频格式进行读写,包括GIF。

moviepy安装

moviepy安装方式有很多,推送使用pip方式;需要确保电脑上安装了python和pip;

打开命令行窗口,执行代码:

pip install moviepy

等待安装成功;

moviepy实操

  1. 给视频添加水印图片 给视频加水印图片,需要准备一段视频,一个水印图片。 分别加载视频和图片素材,指定图片在视频中的位置, 最后合并视频和图片素材,生成一个视频文件;

    需要导入moviepy中的三个功能模块; 视频VideoClip,图片ImageClip,合并CompositeVideoClip

    from moviepy.editor import CompositeVideoClip,ImageClip,VideoFileClip

    代码示例:

    def videoAddPic(video_file,pic_file,out_put):
    video = VideoFileClip(video_file) #加载视频
    logo = (ImageClip(pic_file)
            .set_duration(video.duration)  # 时长
            .resize(height=640)  # 水印高度,等比缩放
            #.margin(left=10, top=10, opacity=1)
            #.set_pos(("left","top")))
            .set_pos(("center")))  # 位置
    #合并素材
    result = CompositeVideoClip([video, logo])
    
    print("开始写入图片。。。")
    # mp4文件默认用libx264编码, 比特率单位bps
    result.write_videofile(out_put, codec="libx264", bitrate="10000000") 
    #生成一个视频文件
    print("写入完成")
    
  2. 视频裁剪 视频裁剪三行代码即可完成,主要使用VideFileClip中的crop方法,crop可以接收四个参数,左上角坐标和宽高; 具体代码参考如下:

    def video_crop_wh(video_file,x=0,y=0,width=None,height=None,output=None):
        '''
        视频裁剪
        :param video_file 视频路径
        :param x y 左上角坐标
        :param width height 宽度高度
        :param output 输出文件路径
        '''
        video_clip = VideoFileClip(video_file)
        video_clip = video_clip.crop(x,y,width=width,height=height)
        video_clip.write_videofile(output)   
    

3.视频合成 合成两段视频,以其中一个视频的宽和高为准; 分别获取两段视频的宽度和高度:

    width, height = video1_clip.w, video1_clip.h       
    video_width, video_height = video2_clip2.w, video2_clip2.h    

对另一段视频就行缩放;

# 视频进行缩放    
    video_clip1 = video2_clip2.resize((width, width * video_height / video_width))    

打包合并两段视频

 video_clip = CompositeVideoClip([video1_clip, video_clip1.set_pos("center")])    
 video_clip.write_videofile('./temp_video.mp4')