写点什么

教你一个快速视频处理的神器:Python moviepy

  • 2022 年 2 月 18 日
  • 本文字数:1819 字

    阅读完需:约 6 分钟

本文分享自华为云社区《python moviepy 的用法,看这篇就能入门》,作者: 梦想橡皮擦。


python 中的视频处理模块,有一个叫做 moviepy,今天我们就来唠唠它。

模块安装使用如下命令即可

pip install moviepy
复制代码

接下来完成第一个 Demo,为后续学习提高信心,截取视频中的一段。

截取视频

下述代码重点使用的是 subclip 方法,但需要提前声明一个 VideoFileClip 对象, VideoFileClip 类的构造函数在代码后进行说明。

from moviepy.editor import *import timeclip = VideoFileClip('./1644974996.mp4').subclip(10, 20)new_file = str(int(time.time())) + '_subclip.mp4'clip.write_videofile(new_file)
复制代码

代码运行结果如下所示:

subclip(t_start,t_end) 方法中的时间参数可以用 (t_start=10) ,以秒的时间来表示,也可以用 (t_start=(1,20)) ,以 1 分 20 秒的形式来表示,还可以 (t_start=(0,1,20)) 或者 (t_start=(00:01:20)) , 以小时: 分钟: 秒的形式表示, t_end 的默认值就是视频的长度

VideoFileClip 类的构造函数如下所示:

__init__(self, filename, has_mask=False,	audio=True, audio_buffersize=200000,	target_resolution=None, resize_algorithm='bicubic',	audio_fps=44100, audio_nbytes=2, verbose=False,	fps_source='tbr')
复制代码

其中只有 filename 为必填项,其余都为选填内容。

  • filename:视频文件名,一般常见格式都支持;

  • has_mask:是否包含遮罩;

  • audio:是否加载音频;

  • audio_buffersize:音频缓冲区大小;

  • target_resolution:加载后需要变换到的分辨率;

  • resize_algorithm:调整分辨率的算法,默认是 bicubic,可以设置为 bilinear,fast_bilinear;

  • audio_fps:声音的采样频率;

  • audio_nbytes:采样的位数;

  • verbose:是否输出处理信息。

subclip(t1,t2) 方法的含义为截取 t1 到 t2 时间段内的片段。write_videofile() 方法用于视频输出。

提取 A 视频的音频,注入到 B 视频中

from moviepy.editor import *
# 读取2个视频文件 videoclip_a = VideoFileClip("1644974996.mp4")videoclip_b = VideoFileClip("1644974998.mp4")
# 提取A视频文件的音频部分audio_a = videoclip_a.audio
# 给B设置音频,注意视频最终合成的大小会依据长的为准videoclip_c = videoclip_b.set_audio(audio_a)
# 输出新的视频文件videoclip_c.write_videofile("videoclip_c.mp4")
复制代码

使用 VideoFileClip 对象的 audio 属性,可以获取视频的音频部分,然后调用 set_audio() 方法对文件进行音频设置,这里要注意一点,合成的音频和视频等于长度的。

去掉视频声音

from moviepy.editor import *
video = VideoFileClip('1644974996.mp4')video = video.without_audio()video.write_videofile('cc.mp4')
复制代码

without_audio() 方法见名知意 - 去除声音。

获取视频信息

视频的分辨率和时间可以直接通过属性读取

from moviepy.editor import *
video = VideoFileClip('1644974996.mp4')print(dir(video))print(video.size) # 获取分辨率print(video.duration) # 获取视频总时长
复制代码

获取文件大小就比较简单了,使用 os 模块的 os.path.getsize() 方法即可,得到的是字节大小。

from moviepy.editor import *
video = VideoFileClip('1644974996.mp4')size = os.path.getsize('1644974996.mp4')print(size)
复制代码

设置视频倍速播放

读取视频,调用 speedx() 方法,其中设置要加速到的倍数。

from moviepy.editor import *clip = VideoFileClip('./1644974996.mp4')
video_1 = clip.speedx(2)video_1.write_videofile('sss.mp4')
复制代码

截取视频封面

很多时候我们需要生成视频的封面,直接使用下述几行代码,即可实现。

from moviepy.editor import *
clip = VideoFileClip('./1644974996.mp4')
clip.save_frame("frame.jpg") # 保存第1帧clip.save_frame("frame.png", t=2) # 保存2s时刻的那1帧
复制代码

提取视频中的音频内容

如果想要把目标视频中的某段音频截取出来,可以使用如下代码

from moviepy.editor import *
clip = VideoFileClip('./1644974996.mp4').subclip(10, 20)
audioclip1 = clip.audio # 从视频对象中提取音频audioclip1.write_audiofile('a.mp3') # 写入音频文件
复制代码

截取视频中的一段,将其保存为 gif

from moviepy.editor import *
clip = VideoFileClip('./1644974996.mp4').subclip(10, 20)
# clip.write_gif('demo.gif',fps=15) # 生成之后的文件大clip.write_gif('demo.gif',fps=5) # 生成之后的文件小
复制代码


点击关注,第一时间了解华为云新鲜技术~​


发布于: 刚刚阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
教你一个快速视频处理的神器:Python moviepy