文章目录
中文文档
http://doc.moviepy.com.cn/index.html#id3
堆叠和连接剪辑
- 顺序播放 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 加转场效果
- 堆叠操作 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的音频操作
- 创建一个新的音频剪辑
音频剪辑可由一个音频文件创建,或从视频剪辑的音轨里提取出来
已创建的视频剪辑的音轨from moviepy.editor import * audioclip = AudioFileClip("some_audiofile.mp3") audioclip = AudioFileClip("some_video.avi")
videoclip = VideoFileClip("some_video.avi") audioclip = videoclip.audio
- 合成音频剪辑
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