社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

百万点赞怎么来?用Python制作抖音视频原来这么简单!

CDA数据分析师 • 3 年前 • 388 次点击  

作者:俊欣

来源:关于数据分析与可视化


那么在上一篇教程当中,我们讲了Python在图片处理当中的应用,通过调用当中的opencv的模块,那么今天小编就和大家来分享一下Python同样也可以用来制作视频,也就是调用moviepy的模块。

关于Moviepy模块

Moviepy是一个用于视频剪辑的Python模块,可被用来进行一些基本的视频剪辑操作,例如视频的拼接、音频视频的合成、添加一些基本的转场等操作,它可以对大多数格式的视频文件进行读取,包括MP4以及GIF
那么我们首先通过pip命令来安装该模块,
pip install moviepy
不同版本的moviepy版本在使用上也存在着出入,这里小编使用的是1.0.1版本

制作视频

在安装好了该模块之后,接下来我们来简单地制作一张视频,步骤也是非常的简单,我们读取若干张照片,将这些照片合成一条视频,并且添加上简单的转场效果。代码如下

import os
from moviepy.editor import *
from moviepy.video.compositing.transitions import crossfadein

filelist = os.listdir("../images/")
clips_list = []
for item in filelist:
    if item.endswith('.png') or item.endswith('.jpg'):  # 判断图片后缀是否是.png
        photo_path = "./images/{}".format(item)
        clips1 = ImageClip(photo_path).set_duration(0.5).fx(crossfadein, 1)
        clips_list.append(clips1)

video_clip = concatenate_videoclips(clips_list, method="compose")
video_clip.write_videofile("test.mp4", fps=24, remove_temp=True)

output

那既然涉及到了转场效果的添加,这里引用的是moviepy.video.compositing.transitions当中的渐入渐出的转场效果(crossfadein/crossfadeout),从整体的代码逻辑上来看,我们在读取了图片之后,分别在后面添加上转场效果,转场的时长为0.5秒,最后我们将这些带有转场效果的图片合成一条视频并且保存到指定的路径。

添加背景音乐

经过上面的实践之后,我们合成出来的视频是没有背景音乐的,moviepy模块还能够为视频添加BGM,代码如下

videoclip = VideoFileClip("video.mp4")
audioclip = AudioFileClip("audio.mp3")
finalclip = videoclip.set_audio(audioclip)
finalclip.write_videofile("final_result.mp4", fps=60, remove_temp=True, codec="libx264")

output

小编所使用的的版本的moviepy,需要去修改源代码当中的部分代码才可以成功地在视频当中添加音频,具体的位置是在\site-packages\moviepy\video\io\ffmpeg_writer.py当中的第86行的-an参数去除掉

视频的二次剪辑

我们也可以在现有视频的基础上进二创,例如对视频进行缩放、翻转等等。例如对视频进行垂直或者是水平方向上的翻转,代码如下

clip1 = VideoFileClip("video.mp4")
clip2 = clip1.fx(vfx.mirror_x)
clip3 = clip1.fx(vfx.mirror_y)

当然我们也可以对视频进行缩放,例如缩放60%,代码如下

clip4 = clip1.resize(0.60)

所有的代码如下所示

from moviepy.editor import VideoFileClip, clips_array, vfx
clip1 = VideoFileClip("out.mp4").margin(10) # 添加空隙
clip2 = clip1.fx(vfx.mirror_x)
clip3 = clip1.fx(vfx.mirror_y)
clip4 = clip1.resize(0.60) # 缩小60%
final_clip = clips_array([[clip1, clip2],
                          [clip3, clip4]])
final_clip.resize(width=480).write_videofile("my_stack.mp4")

output

倘若我们想从视频当中截图一部分出来,调用的是subclip()方法,代码如下




    

clip = VideoFileClip("video.mp4")
clip_2 = clip.subclip(5, 10) # 截取5-10秒的部分出来
clip_2.write_videofile("video_2.mp4")

制作动图

最后moviepy模块也可以和matplotlib可视化模块相结合来制作动图,通过自定义一个函数来生成一帧一帧的图画,最后生成一个gif动图,代码如下

x = np.linspace(-5, 5, 200)
duration = 5

fig, ax = plt.subplots()
def build_frame(t):
    ax.clear()
    ax.plot(x, np.sin(x**2) + np.sinc(x + 2*np.pi/duration * t), lw=5)
    ax.set_ylim(-2.5, 2.5)
    return mplfig_to_npimage(fig)

animation = VideoClip(build_frame, duration=duration)
animation.write_gif('movie_matplotlib.gif', fps=60)

output




 

点这里👇关注我,记得标星哦~


推荐阅读


 

CDA课程咨询

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/137390
 
388 次点击