目录
添加文字报错处理
中文不显示处理
代码实例
给视频添加滚动文字(一)
给视频添加滚动文字(二)
报错内容:OSError: MoviePy Error: creation of None failed because of the following error:
[WinError 2] 系统找不到指定的文件。.
.This error can be due to the fact that ImageMagick is not installed on your computer, or (for Windows users) that you didn't specify the path to the ImageMagick binary in file conf.py, or that the path you specified is incorrect.
报错原因:moviepy处理视频使用的是 ffmpeg,生成文字使用的是 ImageMagick。Windows系统在执行 editor.TextClip() 的时候,会报出如上错误,原因是由于电脑上缺少ImageMagick造成的。
处理方法:需要去官网下载对应操作系统的ImageMagick。下载地址:http://www.imagemagick.org/script/download.php,由于是外网,下载速度比较慢。下载完成并安装到指定位置,然后修改site-packages\moviepy\config_defaults.py,在文件的尾部有如下内容:
import os
FFMPEG_BINARY = os.getenv('FFMPEG_BINARY', 'ffmpeg-imageio')
IMAGEMAGICK_BINARY = os.getenv('IMAGEMAGICK_BINARY', 'auto-detect')
# 把 `IMAGEMAGICK_BINARY = ` 后面的内容
# 换成 ImageMagick 安装路径下 magick.exe 的绝对路径,如下:
import os
FFMPEG_BINARY = os.getenv('FFMPEG_BINARY', 'ffmpeg-imageio')
IMAGEMAGICK_BINARY = r"C:\Program Files\ImageMagick-7.1.0-Q16\magick.exe"
moviepy对中文和多语言环境的支持做得并不好,包括中文文件名以及用于显示文字的TextClip就是典型的中文支持方面存在问题的。对于编解码的问题,可以通过修改解码语句中的编码类型为’asn’或‘cp936’等方式解决,对于文字显示的处理,稍微麻烦。解决办法:找到对应中文字库,将其字库文件拷贝到代码所在目录,将TextClip的参数font不用字体名,而是用字体文件名。字体库位置:C:\Windows\Fonts,鼠标右击字体文件,找到属性中安全下的对象名称,将对象名称复制下来作为font的值。
from moviepy.editor import VideoFileClip
from moviepy import editor
clip = VideoFileClip('video.mp4')
text = '''
红笺小字。
说尽平生意。
鸿雁在云鱼在水。
惆怅此情难寄。
斜阳独倚西楼。
遥山恰对帘钩。
人面不知何处,
绿波依旧东流。
'''
text_clip = editor.TextClip(text, font=r'./font/STKAITI.TTF', fontsize=30, color='blue', bg_color='white', transparent=True)
"""
set_position:設置文字顯示位置【屏幕左上角为(0, 0),右下角为(屏幕宽度, 屏幕高度)】
1、set_position((800, 500)): 显示在800, 500的位置上
2、set_position(("center", "center")): 显示在屏幕的正中央
3、set_position((0.4, 0.6), True): 显示在距离左边百分之40、距离上边百分之60的位置上
set_duration(10): 持续10秒
set_opacity(0.6): 设置透明度为0.6
set_start(5):设置开始显示的时间点
set_end(10):设置结束的时间点
"""
text_clip = text_clip.set_position(("center", "center")).set_duration(20).set_opacity(0.8)
video_clip = editor.CompositeVideoClip([clip, text_clip]) # 把文本剪贴板贴在视频上
video_clip.write_videofile("demo1.mp4") # 保存視頻
from moviepy.editor import VideoFileClip, vfx
from moviepy import editor
demo_video = VideoFileClip('video.mp4')
text = '''
红笺小字。
说尽平生意。
鸿雁在云鱼在水。
惆怅此情难寄。
斜阳独倚西楼。
遥山恰对帘钩。
人面不知何处,
绿波依旧东流。
'''
text_clip = editor.TextClip(text * 4, font=r'./font/STKAITI.TTF', fontsize=20, color="red").set_position(
('center', 0)).set_duration(20).set_opacity(0.8).set_start(5).set_end(25) # 可以直接使用链式操作
w, h = demo_video.size
x_speed = x_start = y_start = 0
y_speed = 20
text_clip = text_clip.fx(vfx.scroll, w, h, x_speed, y_speed, x_start, y_start)
video_clip = editor.CompositeVideoClip([demo_video, text_clip])
video_clip.write_videofile('demo_video01.mp4')
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
# 同畫面中合併視頻,視頻顯示位置設置或屏幕中文本字幕顯示位置set_pos('center')、set_pos((45,150)),見http://doc.moviepy.com.cn/index.html#中的剪輯定位
## 1、添加文字
clip = VideoFileClip('video.mp4')
text = '其形也,翩若惊鸿,婉若游龙。\n荣曜秋菊,华茂春松。\n髣髴兮若轻云之蔽月,飘飖兮若流风之回雪。\n远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。\n秾纤得衷,修短合度。肩若削成,腰如约素。\n延颈秀项,皓质呈露。芳泽无加,铅华弗御。\n云髻峨峨,修眉联娟。丹唇外朗,皓齿内鲜,明眸善睐,靥辅承权。\n瑰姿艳逸,仪静体闲。柔情绰态,媚于语言。奇服旷世,骨像应图。\n披罗衣之璀粲兮,珥瑶碧之华琚。戴金翠之首饰,缀明珠以耀躯。\n践远游之文履,曳雾绡之轻裾。微幽兰之芳蔼兮,步踟蹰于山隅。'
txt_clip = TextClip(txt=text, fontsize=20, color='red', font=r'./font/STKAITI.TTF')
txt_clip = txt_clip.set_pos(lambda t: ('center', -100 + t * 20)).set_duration(25) # 設置一個隨時間變化自動移動的動態字幕
video = CompositeVideoClip([clip, txt_clip]) # 将文本剪辑覆盖在第一个视频剪辑上
video.write_videofile('demo2023.mp4')
补充(视频属性判断)
clip = VideoFileClip('video.mp4') # 是否作为遮罩使用 print(clip.ismask) # 帧的构建方法,通过构造方法传入或set_make_frame方法设置,帧的构建方法用于根据时间构建帧,该方法是get_frame获取帧时调用的方法。帧的构建可以从已有剪辑中获取或变换,也可以代码自己填充 print(clip.make_frame) # 当一个视频帧有遮罩时,使用该属性记录遮罩的剪辑。如果为None,则视频剪辑完全不透明。可以通过add_mask、set_opacity等方法来构建剪辑的遮罩,也可以通过set_mask来将已有的剪辑设置为视频剪辑的遮罩 print(clip.mask) # aspect_ratio属性为剪辑的纵横比,实际上就是剪辑的宽/高。注意该属性为浮点数,只读,通过属性名访问 print(clip.aspect_ratio)