MoviePy中乌尔都语文本显示异常问题求助
解决MoviePy显示乌尔都语文本的RTL与连写问题
你的问题核心在于MoviePy的TextClip依赖ImageMagick渲染文本,而ImageMagick对乌尔都语这类阿拉伯系文字的双向排版(RTL)和字符连写支持存在缺陷。以下是两种更优的解决方案:
方案一:修复arabic_reshaper+python-bidi的使用逻辑
你之前尝试的工具组合是正确的,但可能因编码或字体路径问题导致文本不显示。按以下步骤调整:
- 安装依赖:
pip install arabic-reshaper python-bidi
- 修正代码(关键是文本处理顺序和字体路径):
import arabic_reshaper from bidi.algorithm import get_display from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip ur_text = "پرندہ" # 第一步:处理字符连写 reshaped_text = arabic_reshaper.reshape(ur_text) # 第二步:调整文本方向为RTL(从右到左) display_text = get_display(reshaped_text) clip = VideoFileClip("bg_video.mp4", audio=False) # 注意:直接使用字体文件绝对路径,避免ImageMagick识别字体名失败 ur_txt_clip = TextClip( txt=display_text, font="/usr/share/fonts/truetype/Jameel-Noori-Nastaleeq.ttf", # 替换为你的字体实际路径 fontsize=40, color="black", encoding="utf8" # 强制指定UTF-8编码 ).set_position((0.75, 0.7), relative=True).set_duration(clip.duration).crossfadein(7) video = CompositeVideoClip([clip, ur_txt_clip]) video.write_videofile("output.mp4")
关键说明:
- 必须先执行
arabic_reshaper.reshape()处理连写,再用get_display()调整方向,顺序不能颠倒。 - 用字体文件绝对路径替代字体名,避免ImageMagick的字体缓存或识别问题。
- 添加
encoding="utf8"确保文本编码正确解析。
方案二:简化PIL转ImageClip的封装方案
如果方案一仍有问题,可将PIL渲染文本的逻辑封装成复用函数,大幅减少操作繁琐度:
from PIL import Image, ImageDraw, ImageFont from moviepy.editor import VideoFileClip, ImageClip, CompositeVideoClip def create_urdu_text_clip(text, font_path, fontsize=40, color="black"): # 加载乌尔都语字体 font = ImageFont.truetype(font_path, fontsize) # 获取文本实际渲染尺寸 text_width, text_height = font.getsize(text) # 创建透明背景的PIL图像 img = Image.new("RGBA", (text_width, text_height), (0, 0, 0, 0)) draw = ImageDraw.Draw(img) # PIL原生支持RTL字体的连写和方向,直接绘制即可 draw.text((0, 0), text, font=font, fill=color) # 转换为MoviePy的ImageClip return ImageClip(img) ur_text = "پرندہ" clip = VideoFileClip("bg_video.mp4", audio=False) ur_txt_clip = create_urdu_text_clip( ur_text, "/usr/share/fonts/truetype/Jameel-Noori-Nastaleeq.ttf", fontsize=40, color="black" ).set_position((0.75, 0.7), relative=True).set_duration(clip.duration).crossfadein(7) video = CompositeVideoClip([clip, ur_txt_clip]) video.write_videofile("output.mp4")
优势:
- 封装后可重复调用,无需每次写PIL渲染逻辑。
- PIL对乌尔都语字体的连写和RTL支持比ImageMagick更稳定,避免依赖外部工具的兼容性问题。
内容的提问来源于stack exchange,提问作者Essa
相关产品推荐
相关产品推荐

