首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

MoviePy - 中文文档2-快速上手-MoviePy-视频合成

  • 23-09-22 20:22
  • 3599
  • 5579
blog.csdn.net

回到目录

很久没有更新了。目前使用moviepy的项目里各种问题接踵而至,第一批我只采集了1w个抖音短视频做视频合成,不得不说,moviepy还是不少缺陷的,最开始的大部分时候是ffmpeg引起的OOM,是我分配的内存不够,加大资源分配,每次运行完毕之后清除cache,杀掉已经存在的ffmpeg,稳定运行时间达到了8个小时多,然而在昨晚凌晨又死掉了。现在还在收拾,今天再来更新一下。

Mixing clips(就是视频合成,拼接混合)

视频的排版,众所周知,这是一个非线性编辑的技术活,有时候还要把几段clip在一个新的clip里面一起播放。

还有一点很重要,一般情况下,每一个video clip都带有一个audio 和一个 mask,分别是audio clip和mask clip,通俗地讲就是每一个视频切片带有一个音频切片和一个蒙版切片。所以,当我们把几个视频排版混合到一起的时候。声音轨道和mask也同时被混合在一起形成最终的clip。所以但多数时候我们是不需要操心声音和mask的。

视频叠加和视频拼接

简单地把多个视频合成到一起的两种最简单的办法。1.把视频一个接一个地拼接起来。2.视频叠加在一块,比如一个大的画面同时播几个视频。

视频拼接我们使用concatenate_videoclips函数来完成。

  1. from moviepy.editor import VideoFileClip, concatenate_videoclips
  2. clip1 = VideoFileClip("myvideo.mp4")
  3. clip2 = VideoFileClip("myvideo2.mp4").subclip(50,60)
  4. clip3 = VideoFileClip("myvideo3.mp4")
  5. finalclip = concatenate_videoclips([clip1, clip2, clip3])
  6. finalclip.write_videofile("my_concatenate.mp4")

finalclip会按照clip1,clip2,clip3的顺序将这三个clip播放。这些clip并不需要相同的时长或者大小,仅仅是首尾相连而已。我们还可以通过transition=my_clip这个参数来设置一下clip之间衔接的过渡动画。

视频叠加我们使用clip_array函数来完成

  1. from moviepy.editor import VideoFileClip, clips_array, vfx
  2. clip1 = VideoFileClip("myvideo.mp4").margin(10)
  3. clip2 = clip1.fx(vfx.mirror_x)#x轴镜像
  4. clip3 = clip1.fx(vfx.mirror_y)#y轴镜像
  5. clip4 = clip1.resize(0.6)#尺寸等比缩放0.6
  6. final_clip = clips_array([
  7. [clip1, clip2],
  8. [clip3, clip3]
  9. ])
  10. final_clip.resize(width=480).write_videofile("my_stack.mp4")

举个栗子,大家得到画面差不多和这个相似

../_images/stacked.jpeg

CompositeVideoClips

CompositeVideoClip这个类提供来更加灵活的方式来排版视频,但是它可要比concatenate_videoclips和clips_array要复杂的多了。

video = CompositeVideoClip([clip1, clip2, clip3])

现在,这3个clip是堆叠起来的,啥情况呢,就是,clip2压在clip1上,clip3压在最上面。大家可以想像成栈结构,从左往右,依次入栈这么堆叠在一块,对于一个普通的视频来说,这样堆叠实在是没办法看了。你想像一下,如果clip3的尺寸是最大的,比clip1和clip2都大,那我们只能看到clip3,clip1和clip2都被盖住了。最终要合成的clip的尺寸是默认第一个clip的尺寸,一般第一个也就是做背景用了,但是我们有时候是需要我们的clip浮在一个比较大的合成体的上方的,那这个时候我们就需要声明合成clip的尺寸。看看下面的栗子。

video = CompositeVideoClip([clip1, clip2, clip3], size=(720,480))

开始和结束时间

在堆叠视频中,每个clip会在通过clip.start函数声明的时间开始播放,我们可以像下面这样去设置。

clip1 = clip1.set_start(5) #在5秒时开始

所以一般情况下,我们代码中的视频堆叠都长这个样子。

  1. video = CompositeVideoClip([
  2. clip1, #在第0秒开始
  3. clip2.set_start(5), #在第5秒开始
  4. clip3.set_start(9) #第9秒开始
  5. ])

在下面的栗子里,可能clip2开始的时候,正好是clip1将要结束的时机,这样的情况,我们可以让clip2使用在一秒内“渐入”的特效来显示。

  1. video = CompositeVideoClip([
  2. clip1,
  3. clip2.set_start(5).crossfadein(1),
  4. clip3.set_start(9).crossfadein(1.5)
  5. ])

Positioning clips

clip们的位置设定。

clip2和clip3都比clip1要小,那你可以通过设定位置决定clip2和clip3在画面中的位。下面的栗子就是通过指定坐标的形式(距离左上方的像素距离)把clip2和clip3在画面中指定位置。

  1. video = CompositeVideoClip([
  2. clip1,
  3. clip2.set_pos((45,150)),
  4. clip3.set_pos((90,100))
  5. ])

在moviepy中我们有很多的方法定位clip的位置

  1. clip2.set_pos((45,150)) #像素坐标
  2. clip2.set_pos("center") #居中
  3. clip2.set_pos(("center","top")) #水平方向居中,但是处置方向放置在顶部
  4. clip2.set_pos(("left","center")) #水平方向放置在左边,垂直方向居中
  5. clip2.set_pos((0.4,0.7), relative=True) #0.4倍宽,0.7倍高处
  6. clip2.set_pos(lambda t: ('center', 50+t)) #水平居中,向下移动

clip位置的坐标系,在指定位置时,出现在我们脑海里的坐标系应该是这样子的

../_images/videoWH.jpeg

Compositing audio clips

合成声音clips

在混合vedio clips时,MoviePy将会自动地把这些vedio自带的audio clip按照一定形式混合在一起形成最终的clip,开发者不需要为了这个操心。

如果你有一些特殊的的定制合成音频的需求,应该使用CompositeAudioClip和concatenate_audioclips这俩类。

  1. from moviepy.editor imports *
  2. concat = concatenate_audioclips([clip1, clip2, clip3])
  3. compo = CompositeAudioClip([
  4. aclip1.volumex(1.2),
  5. aclip2.set_start(5), # start at t=5s
  6. aclip3.set_start(9)
  7. ])

QQ群:MoviePy中文 :819718037

回到目录

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树首页概览333612 人正在系统学习中
注:本文转载自blog.csdn.net的ucsheep的文章"https://blog.csdn.net/ucsheep/article/details/81329598"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top