编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN
- 视频文件格式转换:
- 视频转换为图片:
- 将多张图片合成为视频:
- 视频画面缩放旋转:
- 为视频添加边框:
- 截取视频片段:
- 剪辑视频画面:
- 制作快播效果的视频:
- 视频色彩调整:
- 视频的拼接与合成:
- 拼接相同尺寸的视频:
- 叠加多个视频并设置画面位置:
- 制作画中画效果:
- 叠加多个视频并设置开始播放的时间:
- 为视频设置重叠转场效果:
- 视频堆叠效果:
- 制作左右镜像画面的视频:
- 制作手绘风格的视频:
- 制作倒放效果视频:
- 制作先正放再倒放的视频:
- 为视频添加字幕水印:
- 处理音频:
Python处理视频会使用MoviePy模块,使用前需要使用pip3进行安装。
1. 视频文件格式转换:
视频有多种文件格式,可以进行相应的格式转换,示例代码:
from moviepy.editor import VideoFileClip
video_clip=VideoFileClip('sunflower.mp4')
video_clip.write_videofile('sunflower.avi', codec='png')
video_clip.write_videofile('sunflower.flv', codec='flv')
其中,VideoFileClip(filename,audio=True,target_resolution=None)用于读取各种格式视频文件,参数target_resolution可以指定帧高度和宽度,类型是含有两个元素的列表或元组,前一个为高度,后一个为宽度;write_videofile(filename,fps=None,codec=None,audio=True)用于导出视频文件,参数fps指定帧率,codec指定文件编解码器,如果文件名给出扩展名mp4、ogv、webm则会自动选择,对于其他扩展名需要手动指定。
如果需要批量转换视频文件格式:
from pathlib import Path
from moviepy.editor import VideoFileClip
from shutil import copy
src_folder=Path('orignal')
des_folder=Path('target')
if not des_folder.exists():
des_folder.mkdir(parents=True)
for i in src_folder.glob('*'):
if i.is_dir():
continue
if i.suffix.lower()!='.mp4':
video_clip=VideoFileClip(str(i))
new_file=des_folder/(i.stem+'.mp4')
video_clip.write_videofile(str(new_file))
else:
copy(i, des_folder)
2. 视频转换为图片:
1)将视频转换为一系列静态图片:
视频实际上是由一系列静态图像组成的,每张图片为一帧,通常每秒视频包括24~30帧甚至更多的帧。使用MoviePy模块的write_images_sequence()可以导出为一张张图片。
from moviepy.editor import VideoFileClip
video_clip=VideoFileClip('sunset.mp4')
video_clip.write_images_sequence('output_pic/sunset%03d.jpg',fps=5)
其中,write_images_sequence(nameformat,fps=None)用于视频批量导出为静态图片,参数nameformat用于指定图片的存储位置和文件名,文件名中可以使用格式化字符串,%03d中的3表示3位数字编号,文件扩展名也可以使用png。
还可以将指定时间点的画面导出为图片:
from moviepy.editor import VideoFileClip
video_clip=VideoFileClip('guzhen.mp4')
video_clip.save_frame('封面.jpg')
video_clip.save_frame('zhouzhuang.jpg', t=4)
其中,save_frame(filename, t)用于将视频中指定时间点的画面导出为指定格式的图片,t默认值为第一秒。
2)将视频导出为GIF动画:
使用MoviePy模块的write_gif()可以将视频导出为GIF动画:
from moviepy.editor import VideoFileClip
video_clip=VideoFileClip('kaola.mp4',target_resolution(None,320))
video_clip.write_gif('kaola.gif', fps=8, loop=0)
其中,write_gif(filename, fps=None, loop=0)用于将视频导出为GIF动画,fps指定帧率,一般不超过15,loop指定循环播放次数,0表示永久播放。
也可以将视频片段导出为GIF动画:
from moviepy.editor import VideoFileClip
video_clip=VideoFileClip('cat.mp4')
new_clip=video_clip.subclip(1,4)
new_clip=new_clip.crop(width=650,height=650,x_center=video_clip.w/2,y_center=video_clip.h/2)
new_clip=new_clip.resize(0.2)
video_clip.write_gif('cat.gif', fps=8, loop=0)
3. 将多张图片合成为视频:
使用MoviePy模块的ImageSequenceClip类可以实现图片合成视频:
from pathlib import Path
from moviepy.editor import ImageSequenceClip
src_folder='orignal'
file_list=list(Path(src_folder).glob('*.jpg'))
duration_list=[3]*len(file_list)
new_video=ImageSequenceClip(src_folder, durations=duration_list)
new_video.write_videofile('ad.mp4', fps=25)
其中,ImageSequenceClip(sequence, durations=None)用于将图片合成为视频,sequence参数如果为字符串则为存放图片的文件夹路经,如果为列表则每个元素为各张图片的路经字符串;durations参数为一个列表,用于指定每张图片在视频中显示的时长,列表元素个数要与图片张数一致。
4. 视频画面缩放旋转:
1)调整画面尺寸:
from moviepy.editor import VideoFileClip
video_clip=VideoFileClip('cat.mp4')
print(video_clip.size)
video_clip2=VideoFileClip('cat.mp4', target_resolution=[360,1000])
video_clip2.write_videofile('cat.mp4')
VideoFileClip有个size属性,返回两个元素的列表,分别为视频帧的宽度和高度。
也可以按比例调整视频画面尺寸:
new_video=video_clip.resize(newsize=0.5)
不过使用resize函数,需要安装opencv-python、scipy、pillow模块,resize有两种语法格式,一种是resize(newsize=None),指定缩放比例,还有一种含有两个元素的列表或元组resize (height=None, width=None),分别指定帧高度和宽度。
2)旋转视频画面:
from moviepy.editor import VideoFileClip
video_clip=VideoFileClip('cat.mp4')
new_video=video_clip.rotate(angle=90)
new_video.write_videofile('cat.mp4')
其中,rotate(angle, unit='deg')用于旋转视频画面,unit可以使用deg或rad。
5. 为视频添加边框:
使用MoviePy模块的margin来添加边框。添加同等宽度边框:
new_video=video_clip.margin(mar=40, color=(255,255,0))
使用margin(mar=None, left=0, right=0, top=0, bottom=0, color=(0,0,0))添加边框,mar同一指定所有边框的宽度,单位像素;left、right、top、bottom则分别指定左右顶底边框宽度,单位像素,如果指定了mar,这4个参数会被忽略;color指定边框的颜色,默认为黑色。
6. 截取视频片段:
使用MoviePy模块的subclip()截取视频片段:
new_video=video_clip.subclip(0, 20)
subclip(t_start=0, t_end=None)用于从视频中截取两个点之间的内容,t_start指定片段的起始时间点,可以用浮点数表示秒,也可以使用分钟和秒组成的元组或时分秒组成的元组,也能使用冒号分隔的时间字符串;t_end指定片段的结束时间点,省略时截取到视频结尾,参数为负值表示到结尾的秒数。
7. 剪辑视频画面:
使用MoviePy模块的clop()剪辑:
new_video=video_clip.crop(x1=0,y1=436,x2=720,y2=844)
使用crop(x1=None, y1=None, x2=None, y2=None, width=None, height=None, x_center=None, y_center=None)进行视频画面剪辑。
8. 制作快播效果的视频:
使用MoviePy模块的speedx()实现变速效果:
new_video=video_clip.speedx(factor=2)
因为速度变化,声音会变调,可以不导出音频。
其中使用了speedx(factor=None, final_duration=None)调整视频播放速度,参数factor指定变速系数,大于0小于1时播放速度变慢,大于1时播放速度加快;final_duration指定视频的目标时长,函数则会自动计算相应的变速系数,大于原时长播放速度变慢,小于原时长播放速度变快。
9. 视频色彩调整:
1)转换为灰度视频:
使用MoviePy模块的blackwhite()可将视频转换为灰度视频:
from moviepy.editor import VideoFileClip
from moviepy.video.fx.all import blackwhite
video_clip=VideoFileClip('cat.mp4')
new_video=blackwhite(video_clip,RGB=[0.15, 0.15, 0.7])
new_video.write_videofile('graycat.mp4')
其中使用了blackwhite(clip,RGB=None)将彩色图像灰度化,参数RGB指定颜色权重,如果设置为CRT_phosphor则表示RGB=[0.2125, 0.7154, 0.0721],其中三个值之和为1。
2)提高画面明度:
使用MoviePy模块的colorx()可以调整视频的明度:
new_video=colorx(video_clip,factor=1.8)
其中colorx(clip,factor)通过将视频中每一帧的每个像素的RGB值与参数factor相乘以达到更改画面明度的目的,参数factor指定颜色变化系数,大于1时提高明度,大于0小于1时明度降低。
使用前需要导入:from moviepy.video.fx.all import colorx
3)调整亮度对比度:
使用MoviePy模块的lum_contrast()可同时调整视频画面的亮度和对比度:
new_video=lum_contrast(video_clip,lum=40, contrast=0.5)
其中lum_contrast(clip,lum=0, contrast=0, contrast_thr=127)用于调整视频画面的亮度和对比度,参数lum用于指定增加或减小的亮度值,取值范围-255~255,正数时亮度增加,负数时亮度减小;contrast指定要增加或减小的对比度值,取正数对比度增加,取负数对比度减小;contrast_thr指定对比度调整的基准值,默认127。
使用前需要导入:from moviepy.video.fx.all import lum_contrast
4)实现负片效果:
MoviePy模块的invert_colors()能对视频画面进行反色处理:
new_video=invert_colors(video_clip)
使用前需要导入:from moviepy.video.fx.all import invert_colors
5)颜色淡入效果:
MoviePy模块的fadein()可为视频设置颜色渐显效果:
new_video=fadein(video_clip, duration=5)
其中fadein(clip, duration, initial_color=None)用于让视频画面在开始播放后的指定时间内从某种颜色中逐渐显现出来,参数duration用于指定淡入效果的持续时间,单位秒;initial_color指定淡入时使用的颜色,默认黑色。
使用前要导入:from moviepy.video.fx.all import fadein
6)颜色淡出效果:
MoviePy模块的fadeout()可为视频设置颜色渐隐效果:
new_video=fadeout(video_clip, duration=5, final_color=(255,255,255))
其中fadeout(clip, duration, final_color=None)用于让视频画面在结束播放前的指定时间内逐渐隐没在某种颜色中,而且并不会改变视频的时长,参数duration用于指定淡出效果的持续时间,单位秒;final_color指定淡出时使用的颜色,默认黑色。
使用前要导入:from moviepy.video.fx.all import fadeout
7)视频水平垂直翻转:
new_video=mirror_x(video_clip)
new_video=mirror_y(video_clip)
使用前要导入:from moviepy.video.fx.all import mirror_x,mirror_y
10. 视频的拼接与合成:
1)拼接相同尺寸的视频:
MoviePy模块的concatenate_videoclips()用于拼接视频:
from moviepy.editor import VideoFileClip, concatenate_videoclips
video_clip1=VideoFileClip('cat.mp4')
video_clip2=VideoFileClip('dog.mp4')
video_clip3=VideoFileClip('monkey.mp4')
new_video=concatenate_videoclips([video_clip1,video_clip2,video_clip3])
new_video.write_videofile('animals.mp4')
其中concatenate_videoclips(clips,method='chain')用于将多个视频首尾相连地拼接成一个视频,参数clips为一个列表,包含要拼接的多个视频文件,其中的顺序就是拼接顺序。参数method指定拼接方法,默认chain,表示仅将视频简单地按顺序拼接在一起,如果视频画面尺寸不同也不会修正;值为compose时如果视频画面尺寸不同,则生成的新视频的画面尺寸取各个视频尺寸的最大值,画面小的视频播放时居中显示。
为了好的显示效果,一般是选取一个尺寸,然后对所有视频的尺寸进行缩放以达到一致,再进行拼接。
2)叠加多个视频并设置画面位置:
MoviePy模块的CompositeVideoClip类可以叠加视频片段,再结合使用set_position()设置每个视频在画面中的位置:
from moviepy.editor import VideoFileClip, CompositeVideoClip
video_clip1=VideoFileClip('dance1.mp4').subclip(0,8)
video_clip2=VideoFileClip('dance2.mp4').subclip(0,8)
video_clip3=VideoFileClip('dance3.mp4').subclip(0,8)
new_video=CompositeVideoClip([video_clip1.set_position((30,30)), video_clip2.set_position('center'),
new_video.write_videofile('dance_all.mp4', audio=False)
其中CompositeVideoClip(clips, size=None, bg_color=None)用于叠加多个视频,参数size指定叠加后合成视频的画面尺寸,值为None时将第一个视频的尺寸作为合成视频的画面尺寸;bg_color指定合成视频的背景颜色,参数为None表示画面背景设为透明效果。
set_position(pos, relative=False)用于指定视频的位置,可以使用(x,y)格式表示叠加视频左上角在合成视频中的坐标,也可以使用('center', 'top')表示水平居中和顶端对齐,其他还可以使用bottom、right、left;还有(factorY,
因为CompositeVideoClip的音频合成效果不够好,可以不导出音频。
3)制作画中画效果:
from moviepy.editor import VideoFileClip, CompositeVideoClip
video_clip1=VideoFileClip('dance1.mp4')
video_clip2=VideoFileClip('dance2.mp4').resize(newsize=0.35)
new_video=CompositeVideoClip([video_clip1, video_clip2])
new_video.write_videofile('dance.mp4', audio=False)
可以使用set_position()指定画面的位置,不指定时默认左上角对齐。
new_video=CompositeVideoClip([video_clip1, video_clip2.set_position('center')])
4)叠加多个视频并设置开始播放的时间:
new_video=CompositeVideoClip([video_clip1, video_clip2.set_start(8),video_clip3.set_start(16)])
5)为视频设置重叠转场效果:
几个视频片段拼接时,可以添加转场效果,使用叠化转场比较多,也称交叉渐变。这是在两个片段之间有短暂重合,后一个片段开头的画面覆盖在前一个片段结尾的画面上,新画面的透明度逐渐增大,直到转场完成。使用MoviePy模块的crossfadein()可以实现这种转场效果:
from moviepy.editor import VideoFileClip, CompositeVideoClip
video_clip1=VideoFileClip('cat1.mp4')
video_clip2=VideoFileClip('cat2.mp4')
video_clip3=VideoFileClip('cat3.mp4')
new_video=CompositeVideoClip([video_clip1, video_clip2.set_start(8).crossfadein(2),
new_video.write_videofile('diehuazc.mp4')
其中crossfadein(duration) 用于两个视频之间添加叠化转场效果,参数duration用于指定转场效果的时长。
6)视频堆叠效果:
MoviePy模块的clips_array()可以堆叠视频画面,下面代码实现竖版三分屏效果:
new_video=clips_array([video_clip], [video_clip], [video_clip]])
其中clips_array(array, rows_widths=None, cols_widths=None)用于堆叠视频画面,参数array为存放视频的二维嵌套列表,一个大列表中包含一个或多个小列表,小列表数量代表画面的行数,小列表中的元素则是一个或多个视频文件,代表一行中显示的子画面,各个小列表中的元素个数应一致;参数rows_widths和cols_widths分别指定各行的高度和各列的宽度,以列表形式给出,省略会设为None则自动设置,函数会按照参数对原视频进行剪裁而不会进行缩放。
如果要对同一个视频重复堆叠,可以利用*运算符简化:
new_video=clips_array([[video_clip]]*3)
如果要将一个视频重复堆叠为3行4列的分屏画面:
new_video=clips_array([[video_clip]*4]*3)
而横版三分屏可以使用:
new_video=clips_array([[video_clip]*3])
7)制作左右镜像画面的视频:
使用MoviePy模块的clips_array()和mirror_x()可以制作沿中轴线左右对称的视频画面:
from moviepy.editor import VideoFileClip, clips_array
from moviepy.video.fx.all import mirror_x, mirror_y
video_clip1=VideoFileClip('cat.mp4')
video_clip2=mirror_y(video_clip1)
new_video=clips_array([[video_clip1, video_clip2]])
new_video.write_videofile('mirror.mp4')
当然也可以制作上下镜像的画面视频:
new_video=clips_array([[video_clip1],[video_clip2]])
当然也可以用多个视频制作多分屏画面视频。
8)制作手绘风格的视频:
使用MoviePy模块的painting()可以制作手绘风格的视频:
from moviepy.editor import VideoFileClip
from moviepy.video.fx.all import painting
video_clip=VideoFileClip('summer.mp4')
new_video=painting(video_clip, saturation=1.5, black=0.005)
new_video.write_videofile('shouhui.mp4')
其中,painting(clip, saturation=1.4, black=0.006)用于将视频帧的图像转换为用画笔制作的效果,参数saturation指定手绘的颜色饱和度,black指定手绘的黑色线条的数量。
9)制作倒放效果视频:
使用MoviePy模块的time_mirror()能快速实现视频倒放效果:
from moviepy.editor import VideoFileClip
from moviepy.video.fx.all import time_mirror
video_clip=VideoFileClip('runtosea.mp4').subclip(2,5)
new_video=time_mirror(video_clip)
new_video.write_videofile('playback.mp4',audio=False)
10)制作先正放再倒放的视频:
可以先用time_mirror()将原视频转换为倒放视频,然后将原视频和倒放视频拼接在一起,也可以直接使用MoviePy模块的time_symmetrize()来进行转换:
from moviepy.editor import VideoFileClip
from moviepy.video.fx.all import time_symmetrize
video_clip=VideoFileClip('runtosea.mp4').subclip(2,5)
new_video=time_symmetrize(video_clip)
new_video.write_videofile('playforwardback.mp4',audio=False)
11. 为视频添加字幕水印:
要为视频添加字幕或文字水印,需要先安装ImageMagick图片编辑软件,网址https://www.
IMAGEMAGICK_BINARY='C:\\Program Files\ImageMagick-7.1.0-Q16-HDRI\\magick.exe'
如果不清楚MoviePy模块的安装位置,可以通过执行命令pip show moviepy,返回结果的Location后的内容就是MoviePy模块的安装路径。
1)为视频添加标题字幕:
使用MoviePy模块的TextClip添加标题字幕:
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
video_clip=VideoFileClip('night.mp4')
text=TextClip(txt='黄鹤楼', font='FZBangSXJW.ttf', fontsize=120, color='rgb(255, 255, 0)', kerning=10)
text=text.set_position('center')
text=text.set_duration(3)
new_video=CompositeVideoClip([video_clip, text])
new_video.write_videofile('nightnew.mp4')
其中,TextClip(txt=None', filename=None, font='Courier', fontsize=None, color='balck', bg_color
set_duration(t, change_end=True)用于调整视频的时长,参数t指定视频的时长,可用浮点数表示秒,也可以使用分秒组成的元组或时分秒组成的元组,也能使用冒号分隔的时间字符串(如01:03:05.35);change_end设为False时,将根据视频的时长和预设的结束时间修改视频的开始时间。
2)制作滚动字幕:
先用MoviePy模块的credits1()加载文本文件的内容生成字幕,再用scroll()让字幕由下向上滚动:
from moviepy.video.tools.credits import credits1
from moviepy.video.fx.all import scroll
end_clip=credits1('info.txt', width=480, color='white', font='FZZZHUNHJW.ttf', fontsize=60, gap=60)
end_clip=end_clip.set_duration(25)
end_clip=scroll(end_clip, h=720, w=480, x_speed=0, y_speed=80)
end_clip.write_videofile('scrolltext.mp4')
其中,credits1(creditfile, width, color='white', stroke_color=’black’, stroke_width=2, font='Impact-Normal', fontsize=60, gap=0)用于将文本文件转换为字幕剪辑,参数creditfile指定包含字幕内容的文本文件路经;width指定字幕宽度,单位像素;color指定字幕文本的颜色;stroke_color指定字幕文本的描边颜色,stroke_width指定字幕文本的描边宽度;font指定文本的字体,常用格式为字体文件的路径;fontsize指定字幕文本字体的最大值,如果照此参数生成的文本字幕中某一行文本的宽度超出字幕宽度,则整个字幕文本的字体会缩小以适应字幕宽度;gap指定双栏排版信息的栏间距。
可以利用记事本编辑文本,默认使用UTF-8编码,但credits1只能读取ANSI编码文本,可以使用“另存为”命令,在下拉列表框中选择ANSI,即可存为ANSI编码。
scroll(clip, h=None, w=None, x_speed=0, y_speed=0)用于在屏幕上水平或垂直滚动播放视频的内容,参数clip指定要转换为滚动播放效果的视频剪辑,w和h指定滚动区域的宽度和高度,也即生成的滚动视频的画面尺寸,其宽度需与credits1中定义的宽度值一致,否则字幕内容会显示不完整,如果滚动区域的高度能一次性显示所有字幕内容就不会呈现滚动效果;x_speed和y_speed指定滚动的水平速度和垂直速度,单位像素/秒,参数值越大滚动越快。
3)制作图文并排的视频:
from moviepy.editor import VideoFileClip, CompositeVideoClip
clip1=VideoFileClip('huaxu.mp4')
clip2=VideoFileClip('zimuu.mp4')
clip1=clip1.subclip(5, clip2.duration+5)
clip1=clip1.resize(0.6)
clip2=clip2.resize(0.6)
new_video=CompositeVideoClip([clip1.set_position(('left', 'center')), .set_position(('right', 'center'))], size=(1280, 720))
new_video.write_videofile('hunhe.mp4')
4)根据配音为视频添加旁边字幕:
MoviePy模块可以读取SRT格式的字幕文件,并根据文件中的时间轴信息生成字幕。SRT文件是一个文本文件,由4个基本部分组成,第1部分为字幕的序号,一般按顺序增加;第2部分是字幕开始显示和结束显示的时间,精确到毫秒;第3部分是字幕的内容;第4部分是一个空行,表示本条字幕结束。示例:
1
00:00:00,667 --> 00:00:01,667
Hello
2
00:00:01,667 --> 00:00:04,667
Everybody
编写这种SRT文件比较费时费力,不过现在已经有软件可以将音频自动识别和转换成SRT文件了,如“剪映”,生成的为JSON文件,然后需要使用工具软件将JSON转换成SRT文件,如“剪映字幕导出工具”。
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
from moviepy.video.tools.subtitles import SubtitlesClip
generator=lambda txt:TextClip(txt, font='FZBangSXJW.ttf', fontsize=40, color='blue')
sub=SubtitlesClip('pangbai.srt', make_textclip=generator)
sub=sub.set_position('bottom', 'center')
video_clip=VideoFileClip('night.mp4')
new_video=CompositeVideoClip([video_clip, sub])
new_video.write_videofile('nightzimu.mp4', fps=video_clip.fps)
其中,SubtitlesClip(subtitles, make_textclip=None)基于SRT文件创建字幕视频,参数subtitles指定SRT文件路径,make_textclip指定字幕生成器。
5)为视频添加文字水印:
水印可以标明作品的所有权,还能起到宣传作用。为视频添加文字水印的代码:
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
video=VideoFileClip('example.mp4')
text=TextClip(txt='www.dwenzhao.cn', fontsize=80, font='FZZZHUNHJW.ttf', color='gray')
text=text.set_position('right', 'top')
text=text.set_start(20).set_end(video.duration)
text=text.set_opacity(0.5)
new_video=CompositeVideoClip([video_clip, text])
new_video.write_videofile('shuiyin.mp4')
其中,set_opacity()用于设置不透明度,参数通常为0~1之间的浮点数,值越小文字越透明,值0表示完全透明,值1表示完全不透明。
可以批量为视频添加水印:
from pathlib import Path
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
src_folder=Path('orignal')
des_folder=Path('target')
if not des_folder.exists():
des_folder.mkdir(parents=True)
text=TextClip(txt='www.dwenzhao.cn', fontsize=80, font='FZZZHUNHJW.ttf', color='gray')
text=text.set_position('right', 'top')
text=text.set_opacity(0.5)
for i in src_folder.glob('*.mp4'):
video=VideoFileClip(str(i))
text=text.set_start(20).set_end(video.duration)
new_video=CompositeVideoClip([video_clip, text])
video_path=des_folder/i.name
new_video.write_videofile(str(video_path))
这样,目标文件夹下的任意一个视频文件都可以添加上文字水印效果。
6)为视频添加图片水印:
from moviepy.editor import VideoFileClip, ImageClip, CompositeVideoClip
video=VideoFileClip('example.mp4')
pic=ImageClip('logo.png').set_duration(video.duration).resize(0.2).set_position((0.08, 0.7), relative=True).set_opacity(0.7)
new_video=CompositeVideoClip([video_clip, pict])
new_video.write_videofile('shuiyin.mp4')
其中,ImageClip(img, is_mask=False, transparent=True, fromalpha=False)用于读取图片并创建视频剪辑,参数img指定图片文件的路径;is_mask指定是否为遮罩剪辑;transparent为True表示将图片的背景层作为视频剪辑而将alpha层作为遮罩剪辑,如为False则将alpha层作为视频剪辑而将图片背景层作为遮罩剪辑;fromalpha指定是否用图片的alpha构建剪辑。
也可以批量为视频添加图片水印:
from pathlib import Path
from moviepy.editor import VideoFileClip, ImageClip, CompositeVideoClip
src_folder=Path('orignal')
des_folder=Path('target')
if not des_folder.exists():
des_folder.mkdir(parents=True)
pic=ImageClip('logo.png').resize(0.2).set_position((0.08, 0.7), relative=True).set_opacity(0.7)
for i in src_folder.glob('*.mp4'):
video=VideoFileClip(str(i))
pic=pic.set_duration(video.duration)
new_video=CompositeVideoClip([video_clip, pic])
video_path=des_folder/i.name
new_video.write_videofile(str(video_path))
7)制作镂空字幕:
镂空字幕的文本中填充的是视频画面的内容,也就是在视频画面上叠加了一个文本遮罩。遮罩也称蒙版,实际上是一张灰度图片,其像素点的颜色为白灰黑,将遮罩叠加在图像上时,位于白灰黑像素点下面的图像内容是完全可见、部分可见、完全看不见的。需要创建一个字幕,将其转换为遮罩后叠加到视频画面上:
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
video=VideoFileClip('summer.mp4')
text=TextClip(txt='爱莲说', fontsize=300, font='FZZZHUNHJW.ttf', color='write', bg_color='black', size=video.size)
rext=text.to_mask()
video1=video.set_mask(text).subclip(0,5)
video2=video.subclip(3).set_start(3).crossfadein(2)
new_video=CompositeVideoClip([video1, video2])
new_video.write_videofile('ailian.mp4')
12. 处理音频:
完整的视频包括画面和音频两部分。
1)转换音频格式:
MoviePy模块可以读取音频文件,再将其导出为所需要的格式:
from moviepy.editor import AudioFileClip
audio_clip=AudioFileClip('content.m4a')
audio_clip.write_audiofile('content.mp3')
2)截取音频片段:
使用AudioFileClip类读取音频文件后,可以使用subclip()从音频中截取需要的片段:
from moviepy.editor import AudioFileClip
audio_clip=AudioFileClip('summer.mp3')
audio_clip=audio_clip.subclip(0,30)
audio_clip.write_audiofile('summer1.mp3')
3)删除视频中的音频:
MoviePy模块的without_audio()可以快速删除视频中的音频:
from moviepy.editor import VideoFileClip
video_clip=VideoFileClip('summer.mp4')
video_clip=video_clip.without_audio()
video_clip.write_videofile('summer1.mp4')
4)从视频中提取音频:
from moviepy.editor import VideoFileClip
video_clip=VideoFileClip('summer.mp4')
audio_clip=video_clip.audio
audio_clip.write_audiofile('bgm.mp3')
5)为视频添加背景音乐:
可以先用VideoFileClip读取音频文件,再用set_audio()将视频的音频轨道指定为所读取的音频,如果音频时长短,可以使用audio_loop()把音频重复播放一定的次数以使二者一样长:
from moviepy.editor import VideoFileClip, AudioFileClip
from moviepy.audio.fx.all import audio_loop
video_clip=VideoFileClip('summer.mp4')
audio_clip=AudioFileClip('bgm.mp3')
audio_clip=audio_loop(audio_clip, duration=video_clip.duration)
new_video=video_clip.set_audio(audio_clip)
new_video.write_videofile('summer1.mp4')
其中,audio_loop(audioclip, nloop=None, duration=None)用于将音频内容重复播放一定的次数,参数nloop指定音频播放的次数,duration指定音频播放最终的时长。
如果音频时长长,可以使用subclip()截取片段,然后再用set_audio()添加到视频,否则视频静止于最后一帧等待音频结束。代码:
from moviepy.editor import VideoFileClip, AudioFileClip
from moviepy.audio.fx.all import audio_loop
video_clip=VideoFileClip('summer.mp4')
audio_clip=AudioFileClip('bgm.mp3').subclip(0, video_clip.duration)
new_video=video_clip.set_audio(audio_clip)
new_video.write_videofile('summer1.mp4')
6)调节视频中的音量:
使用MoviePy模块的volumex()可以调节视频中的音频音量:
from moviepy.editor import VideoFileClip
from moviepy.audio.fx.all import audio_loop
video_clip=VideoFileClip('summer.mp4').volumex(0.2)
video_clip.write_videofile('summer1.mp4')
其中,volumex(factor)用于调节视频中音频的音量,参数factor用于指定音量的升降系数,为浮点数,在0~1之间时降低音频,大于1升高音量。
对于音频文件,可以使用AudioFileClip类的volumex()来调节音量。
7)为视频中的音频设置淡入淡出效果:
为了让加入的音频过度自然,可在音频的开头和结尾分别添加淡入和淡出效果,使用的是MoviePy模块的audio_fadein()和audio_fadeout():
from moviepy.editor import VideoFileClip, AudioFileClip
from moviepy.audio.fx.all import audio_fadein, audio_fadeout
video_clip=VideoFileClip('summer.mp4')
audio_clip=AudioFileClip('bgm.mp3').subclip(0, video_clip.duration)
audio_clip=audio_fadein(audio_clip, 5)
audio_clip=audio_fadeout(audio_clip, 5)
new_video=video_clip.set_audio(audio_clip)
new_video.write_videofile('summer1.mp4')