moviepy音视频剪辑:TextClip不支持中文字符以及OSError: magick.exe: unable to read font 仿宋_GB2312.ttf的解决办法

本文详细介绍了在moviepy中处理中文文本显示问题的方法,包括如何正确设置字体以支持中文显示,以及如何使用TextClip实现中英文混合内容的滚动显示。通过解决字体路径和名称的编码问题,成功在视频中添加了滚动的中英文混排字幕。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

☞ ░ 前往老猿Python博文目录

一、引言

moviepy对中文和多语言环境的支持做得并不好,包括中文文件名以及用于显示文字的TextClip就是典型的中文支持方面存在问题的。对于编解码的问题,可以通过修改解码语句中的编码类型为’asn’或‘cp936’等方式解决,对于文字显示的处理,则稍微麻烦点。

二、使用TextClip对中英文混合内容进行滚动显示

本案例为win7 64位中文操作系统+Python3.72+Moviepy2.0.0dev1环境实现,其他环境老猿没测试过。

2.1、案例代码

将指定混合中英文内容的文本转成TextClip后与一个视频合成后输出,具体代码如下:

if __name__=='__main__':
	#用一位老同学写的短诗的中英文作为TextClip显示内容,由于内容过长需要滚动显示
    inf = """致敬奋战在一线的巾帼女英雄  

    你也是孩子的妈妈,

    你也是爸妈的孩子。

    但你说只要穿上白大褂,

    我就是一名医护人员,

    这就是我的职责。

    我看不清你的长相,

    在层层的防护服里,

    都是一颗颗金子般的心。

    “青山一道同云雨,明月何曾是两乡”

    引用自王昌龄的《送柴侍御》,

    为在抗击疫情一线的女性“逆行者”致敬。

    中国加油!武汉加油!

    武汉人民感谢所有白衣天使!

    Pay tribute to the heroine fighting in the front line
            Yao Junfeng, Wuhan University
    
    You are also the mother of the child,
    You're also a parent's child.
    But you said just put on the white coat,
    I'm a healthcare worker,
    This is my duty.
    I can't see what you look like,
    In layers of protective clothing,
    Every heart is like gold.
    "The green mountains are the same as the clouds and the rain. How could the bright moon be the two villages?"
    It is quoted from Wang Changling's "See  Mr. Chai Off",

    To pay tribute to the female "reverse" in the front line of fighting the epidemic.

    Go China! Come on, Wuhan!

    Wuhan people thank all angels in white!

    """
    clip = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4", audio=False).crop(0, 300, 540, 840).subclip(0, 0.05)
    txtclip = TextClip(inf, font='仿宋_GB2312', fontsize=18, color='blue', bg_color='white', transparent=True).set_duration(30).resize((clip.size[0], clip.size[1] * 2)).set_fps(clip.fps).set_start(clip.end)

    w = None
    h = clip.size[1]
    x_speed = x_start = y_start 0
    y_speed = 20
    txtclip = txtclip.fx(vfx.scroll, w, h, x_speed, y_speed, x_start, y_start)  # .set_start(clip.end)

    newclip = CompositeVideoClip([txtclip, clip], bg_color=(255, 255, 255), ismask=False)
    newclip.write_videofile(r"F:\video\WinBasedWorkHard_scroll.mp4", threads=8)
2.2、输出剪辑播放截图

在这里插入图片描述
可以看到中文部分一个字符也没有,只有几个标点符号,下面的英文全部正常显示。

2.3、解决办法

找到对应中文字库,将其字库文件拷贝到代码所在目录,将TextClip的参数font不用字体名,而是用字体文件名。

2.3.1、找到字库文件名

通过资源管理器,打开C:\Windows\Fonts目录,可以看到所有字体名和对应文件,截图如下:在这里插入图片描述
可以看到字体’仿宋_GB2312’ 对应字体文件为“仿宋_GB2312.ttf”。

2.3.3、将字库文件拷贝到代码工作目录
2.3.4、修改代码并执行
txtclip = TextClip(inf, font='仿宋_GB2312', fontsize=18, color='blue', bg_color='white', transparent=True).set_duration(30).resize((clip.size[0], clip.size[1] * 2)).set_fps(clip.fps)

这行代码的font参数内容替换为:

txtclip = TextClip(inf, font='仿宋_GB2312.ttf', fontsize=18, color='blue', bg_color='white', transparent=True).set_duration(30).resize((clip.size[0], clip.size[1] * 2)).set_fps(clip.fps)

执行后报错,报错信息信息如下:

Traceback (most recent call last):
  File "C:\Program Files\Python37\lib\site-packages\moviepy\video\VideoClip.py", line 1248, in __init__
    subprocess_call(cmd, logger=None)
  File "C:\Program Files\Python37\lib\site-packages\moviepy\tools.py", line 43, in subprocess_call
    raise IOError(err.decode("utf8"))
OSError: magick.exe: unable to read font `仿宋_GB2312.ttf' @ error/annotate.c/RenderFreetype/1382.


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "F:/study/python/project/moviepyTest/moviepyTest.py", line 64, in <module>
    txtclip = TextClip(inf, font='仿宋_GB2312.ttf', fontsize=18, color='blue', bg_color='white', transparent=True).set_duration(30).resize((clip.size[0], clip.size[1] * 2)).set_fps(clip.fps)
  File "<decorator-gen-85>", line 2, in __init__
  File "C:\Program Files\Python37\lib\site-packages\moviepy\decorators.py", line 89, in wrapper
    return f(*new_a, **new_kw)
  File "C:\Program Files\Python37\lib\site-packages\moviepy\video\VideoClip.py", line 1258, in __init__
    raise IOError(error)
OSError: MoviePy Error: creation of None failed because of the following error:

magick.exe: unable to read font `仿宋_GB2312.ttf' @ error/annotate.c/RenderFreetype/1382.
.

.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. Check the documentation.

Process finished with exit code 1

这是因为字体文件名为中文名导致的,很简单将拷贝过去的字体文件改一下名即可,老猿将其改为:fs_GB2312.ttf,同时代码中font参数也修改为对应文件名即可。最后完整代码如下:

from  moviepy.editor import *


if __name__=='__main__':
    inf = """致敬奋战在一线的巾帼女英雄

    你也是孩子的妈妈,

    你也是爸妈的孩子。

    但你说只要穿上白大褂,

    我就是一名医护人员,

    这就是我的职责。

    我看不清你的长相,

    在层层的防护服里,

    都是一颗颗金子般的心。

    “青山一道同云雨,明月何曾是两乡”

    引用自王昌龄的《送柴侍御》,

    为在抗击疫情一线的女性“逆行者”致敬。

    中国加油!武汉加油!

    武汉人民感谢所有白衣天使!

    Pay tribute to the heroine fighting in the front line
    
    You are also the mother of the child,
    You're also a parent's child.
    But you said just put on the white coat,
    I'm a healthcare worker,
    This is my duty.
    I can't see what you look like,
    In layers of protective clothing,
    Every heart is like gold.
    "The green mountains are the same as the clouds and the rain. How could the bright moon be the two villages?"
    It is quoted from Wang Changling's "See  Mr. Chai Off",

    To pay tribute to the female "reverse" in the front line of fighting the epidemic.

    Go China! Come on, Wuhan!

    Wuhan people thank all angels in white!

    """
    ret =  TextClip.search('gb','font')
    print(ret)

    clip = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4", audio=False).crop(0, 300, 540, 840).subclip(0, 0.5)
    txtclip = TextClip(inf, font='fs_GB2312.ttf', fontsize=18, color='blue', bg_color='white', transparent=True).set_duration(30).resize((clip.size[0], clip.size[1] * 2)).set_fps(clip.fps)

    w = None
    h = clip.size[1]
    x_speed = x_start = y_start = 0
    y_speed = 20
    txtclip = txtclip.fx(vfx.scroll, w, h, x_speed, y_speed, x_start, y_start).set_start(clip.end)

    newclip = CompositeVideoClip([txtclip, clip], bg_color=(255, 255, 255), ismask=False)
    newclip.write_videofile(r"F:\video\WinBasedWorkHard_scroll.mp4", threads=8)

此时再播放文件可以看到中英文都正常显示:
在这里插入图片描述

更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。

关于收费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学5G!

☞ ░ 前往老猿Python博文目录
<think>嗯,用户想了解Excel中的VLOOKUP函数的用法和参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数分别是查找值、表格范围、列索引号和匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这时候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同时,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式时范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这时候需要统一格式。还有,当出现#N/A错误时,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部分数据匹配出错的情况。这时候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动时偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同时,提供常见错误和解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP和其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列和返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部分匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值