CodeGym /课程 /Python SELF ZH /向视频添加文本、字幕和片头:字体、颜色和位置设置

向视频添加文本、字幕和片头:字体、颜色和位置设置

Python SELF ZH
第 47 级 , 课程 4
可用

1. 了解 MoviePy 的文本世界

好啦,我们准备深入探索添加文本的魔法视频编辑世界。想象一下,你是导演,你的任务不仅是让角色说话,还要控制屏幕上显示的文字。没错,这就是字幕和片头的魔法!

开始之前,先理解一个简单的事实:MoviePy 不是普通的视频编辑库。它是你个人的视频设计师,能够为你的项目增添一点魅力和信息量。你已经掌握了视频编辑的基础:剪辑、拼接以及一些特效 — 现在是时候迈向下一个阶段了。

为什么要加文本?

视频中的文本非常重要 — 它可以是信息提示、风格化片头,当然,还有那些晚上邻居休息时的救命字幕。MoviePy 让这些操作既方便又时尚。

2. 处理文本

我们从简单的文本元素开始吧。为此,MoviePy 提供了一个很棒的函数 TextClip,它允许在视频剪辑中添加文本。

创建文本剪辑

文本剪辑的基本设置看起来是这样的:


from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip

# 打开视频文件
video = VideoFileClip("sample_video.mp4")

# 创建文本剪辑
txt_clip = TextClip("你好,世界!", fontsize=70, color='white')

# 设置文本剪辑的持续时间
txt_clip = txt_clip.set_duration(video.duration)

# 设置文本的位置
txt_clip = txt_clip.set_position('bottom')

# 合成视频和文本
video_with_text = CompositeVideoClip([video, txt_clip])

# 保存文件
video_with_text.write_videofile("output_video_with_text.mp4", fps=24)

设置字体和颜色

字体和文本颜色都能轻松调整。在上面的例子中,文本颜色是白色,你也可以选择其他颜色,比如:


txt_clip = TextClip("你好,世界!", fontsize=70, font='Amiri-bold', color='yellow')

类似的,你也可以更改字体,前提是你的系统中安装了所需的字体。

3. 设置屏幕上的文本位置

可以通过 set_position() 参数设置文字的位置,该参数可以接受文字值(例如 'center', 'bottom')或者具体坐标。

在不同位置放置文本


# 把文本放在顶部
text_top = TextClip("顶部文本", fontsize=30, color='blue').set_position(('center', 'top')).set_duration(5)

# 把文本放在底部
text_bottom = TextClip("底部文本", fontsize=30, color='green').set_position(('center', 'bottom')).set_duration(5)

# 在具体坐标 (x=100, y=100) 放置文本
text_coords = TextClip("坐标文本", fontsize=30, color='red').set_position((100, 100)).set_duration(5)

# 将所有文本叠加到视频中
final_video = CompositeVideoClip([video, text_top, text_bottom, text_coords])
final_video.write_videofile("video_with_positioned_text.mp4")

这里:

  • ('center', 'top'): 将文本居中放置顶部。
  • ('center', 'bottom'): 将文本居中放置底部。
  • (100, 100): 根据具体坐标设置文本位置。

动态更新文本

不仅添加文本,甚至让它动起来 — 这真的让视频更吸引人。我们来试试让文本变得动画化。


def move_text(t):
    return 10, 100 * t  # 随时间向下移动文本

txt_clip = txt_clip.set_pos(move_text).set_duration(3)

4. 处理字幕

字幕是与视频特定时刻同步的文本。我们可以从文件加载它们,也可以手动创建。

手动添加字幕

让我们从一个简单的示例开始,在视频中添加字幕。为此,需要创建文本剪辑并设置它显示的时间:


# 创建字幕
subtitles = [
    {"text": "你好,世界!", "start": 0, "end": 2},
    {"text": "这是字幕!", "start": 2.5, "end": 5}
]

# 将字幕与视频合成
sub_clips = [TextClip(sub['text'], fontsize=50, color='white')
             .set_position(('center', 'bottom'))
             .set_start(sub['start'])
             .set_duration(sub['end'] - sub['start'])
             for sub in subtitles]

video_with_subtitles = CompositeVideoClip([video] + sub_clips)

video_with_subtitles.write_videofile("output_video_with_subtitles.mp4", fps=24)

从文件加载字幕

如果你有 SRT 格式的字幕文件,可以更简单地加载它们。MoviePy 支持这些文件格式,这大大简化了流程。

字幕通常以 SRTVTT 格式创建,包含字幕文本和时间戳,指明每个文本段应何时出现和消失。例如,以下是 .srt 文件的示例:


1
00:00:01,000 --> 00:00:04,000
你好,这是一个字幕示例。

2
00:00:05,000 --> 00:00:08,000
这个字幕稍后出现。

每个部分包含:

  • 字幕行号。
  • 小时:分钟:秒,毫秒 格式的时间区间。
  • 字幕文本。

安装必要的库

MoviePy 不直接支持加载 .srt 文件,但可以通过库 pysrt 实现。它能加载并解析 .srt 文件,然后将其转换为文本剪辑以叠加在视频上。

安装必要的库:

Bash

pip install moviepy pysrt

用 PySRT 从文件加载字幕

首先,用 pysrt 从文件加载字幕并转换为 MoviePy 能用的文本剪辑。

从文件加载字幕并转换为文本剪辑


import pysrt
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip

# 加载视频
video = VideoFileClip("sample_video.mp4")

# 从文件加载字幕
subtitles = pysrt.open("subtitles.srt", encoding='utf-8')

# 每条字幕的文本剪辑列表
subtitle_clips = []

# 将字幕转换为文本剪辑
for subtitle in subtitles:
    # 字幕文本
    text = subtitle.text
    
    # 字幕的开始和结束时间(秒)
    start_time = subtitle.start.seconds + subtitle.start.milliseconds / 1000.0
    end_time = subtitle.end.seconds + subtitle.end.milliseconds / 1000.0
    duration = end_time - start_time

    # 为字幕创建文本剪辑
    text_clip = TextClip(text, fontsize=24, color='white', font="Arial")
    text_clip = text_clip.set_position(('center', 'bottom')).set_start(start_time).set_duration(duration)
    
    # 将文本剪辑添加到列表
    subtitle_clips.append(text_clip)

# 将所有字幕叠加到视频中
final_video = CompositeVideoClip([video] + subtitle_clips)
final_video.write_videofile("video_with_subtitles.mp4")

代码的说明

  1. 使用 pysrt.open() 加载字幕: 该函数加载 .srt 字幕文件并返回包含所有行的对象 subtitles

  2. 为每条字幕创建文本剪辑:

    • 文本: 通过 subtitle.text 获取。
    • 开始和结束时间: 转换为秒数以与 MoviePy 兼容。
    • 持续时间: 计算结束时间与开始时间的差值。
  3. 设置文本: 每条字幕作为文本剪辑 TextClip 创建。

  4. 将所有字幕叠加到视频中: 使用 CompositeVideoClip 将所有文本剪辑叠加到主视频剪辑上。

5. 添加片头

添加开头和结尾片头

片头通常位于视频的开头或结尾,包含关于项目、作者及其他信息。可以通过在黑色背景上叠加文本来制作片头。

制作开头和结尾片头


# 创建开头片头
intro_text = TextClip("开头片头", fontsize=40, color='white', font="Arial")
intro_text = intro_text.set_position('center').set_duration(3).on_color(size=(video.w, video.h), color=(0, 0, 0), col_opacity=1)

# 主视频片段
main_video = video.subclip(0, 10)  # 主视频从第 0 秒到第 10 秒

# 创建结尾片头
outro_text = TextClip("结尾片头", fontsize=40, color='white', font="Arial")
outro_text = outro_text.set_position('center').set_duration(3).on_color(size=(video.w, video.h), color=(0, 0, 0), col_opacity=1)

# 将片头和主视频合并
final_video = concatenate_videoclips([intro_text, main_video, outro_text])
final_video.write_videofile("video_with_credits.mp4")

这里:

  • on_color() 为文本剪辑创建指定颜色的背景(此例中为黑色)。
  • concatenate_videoclips() 将片头和主视频合并为一个文件。

设置文本显示的时间

在 MoviePy 中,可以使用 set_duration()set_start() 方法设置文本显示的时间。这让你可以精确控制文本在屏幕上显示的时间和时长。

在指定时间显示文本


# 一个在第 2 秒出现并显示 3 秒的文本剪辑
delayed_text = TextClip("延迟文本", fontsize=30, color='blue')
delayed_text = delayed_text.set_position('center').set_start(2).set_duration(3)

# 将文本添加到视频
final_video = CompositeVideoClip([video, delayed_text])
final_video.write_videofile("video_with_timed_text.mp4")

这里:

  • set_start(2) 延迟文本在第 2 秒出现。
  • set_duration(3) 使文本在 3 秒后消失。
1
调查/小测验
MoviePy 视频编辑基础知识第 47 级,课程 4
不可用
MoviePy 视频编辑基础知识
MoviePy 视频编辑基础知识
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION