You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MoviePy中乌尔都语文本显示异常问题求助

解决MoviePy显示乌尔都语文本的RTL与连写问题

你的问题核心在于MoviePy的TextClip依赖ImageMagick渲染文本,而ImageMagick对乌尔都语这类阿拉伯系文字的双向排版(RTL)和字符连写支持存在缺陷。以下是两种更优的解决方案:

方案一:修复arabic_reshaper+python-bidi的使用逻辑

你之前尝试的工具组合是正确的,但可能因编码或字体路径问题导致文本不显示。按以下步骤调整:

  1. 安装依赖:
pip install arabic-reshaper python-bidi
  1. 修正代码(关键是文本处理顺序和字体路径):
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 06:05:55