moviepy学习笔记--python视频剪辑

中文文档

http://doc.moviepy.com.cn/index.html#id3

堆叠和连接剪辑

  1. 顺序播放 concatenate_videoclips
from moviepy.editor import VideoFileClip, concatenate_videoclips
clip1 = VideoFileClip("myvideo.mp4")
clip2 = VideoFileClip("myvideo2.mp4").subclip(50,60)
clip3 = VideoFileClip("myvideo3.mp4")
final_clip = concatenate_videoclips([clip1,clip2,clip3])
final_clip.write_videofile("my_concatenation.mp4")

# subclip()时间s截取部分视频
# write_videofile 保存写入文件

concatenate_videoclips 重要参数:

  • bg_color 背景颜色填充
  • transition 加转场效果
  1. 堆叠操作 clip_array
    视频同屏排列播放
final_clip = clips_array([[clip1, clip2],
                          [clip3, clip4]])
final_clip.resize(width=480).write_videofile("my_stack.mp4")
# resize(width=480) 保存视频大小

合成视频剪辑

CompositeVideoClip
遮罩功能,后面的clip3优先级最高,在最上层

video = CompositeVideoClip([clip1,clip2,clip3], size=(720,460))
# 视频输出大小

起始和终止时间

clip1.set_start() 从视频的第几秒开始

video = CompositeVideoClip([clip1, # starts at t=0
                            clip2.set_start(5).crossfadein(1),
                            clip3.set_start(9).crossfadein(1.5)])
#  crossfadein  x秒的淡入效果

剪辑的定位

set_pos 设置在视频在屏幕的位置

video = CompositeVideoClip([clip1,
                            clip2.set_pos((45,150)),
                            clip3.set_pos((90,100))])
clip2.set_pos((45,150)) 
clip2.set_pos("center")  自动居中
clip2.set_pos(("center","top")) 水平居中,置顶
clip2.set_pos(("left","center"))垂直居中 ,最左
clip2.set_pos((0.4,0.7), relative=True) 位置百分比
clip2.set_pos(lambda t: ('center', 50+t) )   水平居中,向下移动

合成音频剪辑

om moviepy.editor import *
# ... make some audio clips aclip1, aclip2, aclip3
concat = concatenate_audioclips([aclip1, aclip2, aclip3])
compo = CompositeAudioClip([aclip1.volumex(1.2),
                            aclip2.set_start(5), # start at t=5s
                            aclip3.set_start(9)])

预览剪辑的多种方法

clip.save_frame
保存视频中的一帧

my_clip.save_frame("frame.jpeg") # saves the first frame
my_clip.save_frame("frame.png", t=2) # saves the frame a t=2s

clip.show
预览剪辑里的一帧

my_clip.show() # shows the first frame of the clip
my_clip.show(10.5) # shows the frame of the clip at t=10.5s
my_clip.show(10.5, interactive = True)
# interactive  交互式显示,点击输出位置和像素

clip.show
预览视频,交互式

my_clip.preview() # preview with default fps=15
my_clip.preview(fps=25)
my_clip.preview(fps=15, audio=False) # don't generate/play the audio.
my_audio_clip.preview(fps=22000)

MoviePy的音频操作

  1. 创建一个新的音频剪辑
    音频剪辑可由一个音频文件创建,或从视频剪辑的音轨里提取出来
    from moviepy.editor import *
    audioclip = AudioFileClip("some_audiofile.mp3")
    audioclip = AudioFileClip("some_video.avi")
    
    已创建的视频剪辑的音轨
    videoclip = VideoFileClip("some_video.avi")
    audioclip = videoclip.audio
    
  2. 合成音频剪辑
    videoclip2 = videoclip.set_audio(my_audioclip)
    videoclip2 = videoclip.set_audio(my_audioclip)
    

MoviePy生成的剪辑基本类型

下面的代码总结了你可以用MoviePy生成的剪辑基本类型

长视频是由视频剪辑组成的:

  • 一种是动态剪辑(由VideoFileClip和VideoClip组成),
  • 另一种是非动态剪辑,在任意无限长的持续时间中展示同一图片(ImageClip、TextClip、ColorClip)。
  • 还有一种特殊的视频剪辑叫做遮罩,同属于上面的类别,但是输出灰度值帧以表示另一个剪辑里的可见部分。一个视频剪辑可以携带一个音频剪辑clip.audio作为她的音轨,和一个遮罩剪辑。
clip = VideoClip(make_frame, duration=4) # for custom animations (see below)
clip = VideoFileClip("my_video_file.mp4") # or .avi, .webm, .gif ...
clip = ImageSequenceClip(['image_file1.jpeg', ...], fps=24)
clip = ImageClip("my_picture.png") # or .jpeg, .tiff, ...
clip = TextClip("Hello !", font="Amiri-Bold", fontsize=70, color="black")
clip = ColorClip(size=(460,380), color=[R,G,B])

# AUDIO CLIPS
clip = AudioFileClip("my_audiofile.mp3") # or .ogg, .wav... or a video !
clip = AudioArrayClip(numpy_array, fps=44100) # from a numerical array
clip = AudioClip(make_frame, duration=3) # uses a function make_frame(t)

VideoClip

如果你只想编辑视频文件,你就永远不会用到它,从别的库里生成的帧来生成动画时,这个类就会很有用
需要做的只是定义一个make_frame(t)函数,使它返回一个HxWx3的numpy数组(8位整数)来代表时间t时的帧
import gizeh
import moviepy.editor as mpy

def make_frame(t):
    surface = gizeh.Surface(128,128) # width, height
    radius = W*(1+ (t*(2-t))**2 )/6 # the radius varies over time
    circle = gizeh.circle(radius, xy = (64,64), fill=(1,0,0))
    circle.draw(surface)
    return surface.get_npimage() # returns a 8-bit RGB array

clip = mpy.VideoClip(make_frame, duration=2) # 2 seconds
clip.write_gif("circle.gif",fps=15)
# 注意,剪辑使用make_frame并没有一个精确的帧速率,所以你必须要为write_gif和write_videofile,以及需要遍历每一帧的方法提供帧速率(fps,每秒的帧数)。

VideoFileClip

视频文件剪辑是由视频文件(支持大多数格式)或GIF文件中读取的剪辑
myclip = VideoFileClip("some_video.avi")
myclip = VideoFileClip("some_animation.gif")

注意,这些剪辑都有fps(帧速率)属性,而且会以write_videofile、write_gif等的默认设置会使用

myclip = VideoFileClip("some_video.avi")
print (myclip.fps) # prints for instance '30'
# Now cut the clip between t=10 and 25 secs. This conserves the fps.
myclip2 = myclip.subclip(10, 25)
myclip2.write_gif("test.gif") # the gif will have 30 fps

ImageSequenceClip

这是一种由一系列图片组成的剪辑,你可以这样调用
clip = ImageSequenceClip(images_list, fps=25)

github 地址 https://github.com/Zulko/moviepy
文档 https://zulko.github.io/moviepy/getting_started/compositing.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值