Python字幕滚动:为视频添加专业级动态效果!

news2024/11/22 18:25:46

Python实现由下向上滚动字幕

在数字媒体和编程领域,动态文本效果总能吸引观众的注意力。其中,滚动字幕是一种常见的视觉效果,经常用于视频、演示文稿和网页中。在Python中,我们可以通过多种方式来实现滚动字幕效果,比如使用pygame库。今天,我们就来探讨如何使用Python和pygame库来创建一个由下向上滚动的字幕效果。

环境准备

环境是python3.10.10,win11开发。
在开始之前,确保你已经安装了Python环境。此外,我们还需要安装pygame库,可以通过以下命令进行安装:

pip install pygame

基础概念

pygame是一个开源的Python库,用于开发视频游戏。它提供了制作游戏所需的基本功能,包括图形显示、声音播放和事件处理等。对于我们今天的目的来说,我们将主要利用它的图形显示功能。

代码实现

下面是一个简单的由下向上滚动字幕的Python脚本示例:

    import pygame
    import os

    def getColor():
        # 生成随机颜色,排除黑色
        color = (0, 0, 0)
        while color == (0, 0, 0):  # 确保颜色不是黑色
            color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))

        return color

    def render_barrage_list(texts, output_folder="frames"):
        # 初始化pygame
        pygame.init()

        # 设置窗口大小
        screen_width = 720
        screen_height = 1280

        fontsize = 20
        move_speed = 15  # 弹幕移动速度
        max_barrages = len(texts)  # 同时显示的最大弹幕数量
        x_position = 50
        screen = pygame.display.set_mode((screen_width, screen_height))

        # 设置字体
        font = pygame.font.Font("msyh.ttc", fontsize)  # 使用默认字体
        font.set_bold(True)  # 设置字体加粗
        # 清除旧文件
        if not os.path.exists(output_folder):
            os.makedirs(output_folder)
        else:
            #清空文件夹内容
            for filename in os.listdir(output_folder):
                file_path = os.path.join(output_folder, filename)
                if os.path.isfile(file_path) or os.path.islink(file_path):
                   os.unlink(file_path)



        # 设置背景颜色
        bg_color = (0, 0, 0,0)
        screen.fill(bg_color)

        # 弹幕参数
        line_height = font.get_linesize() + 10  # 每行文本的高度加上一些间隔
        barrage_interval = line_height  # 弹幕之间的间隔
        # 初始化弹幕列表
        barrage_list = []
        for i, text in enumerate(texts):
            color = getColor()
            text_surface = font.render(text, True, color)
              # 弹幕左对齐
            y_position = (screen_height - 500) + (i % max_barrages) * barrage_interval
            barrage_list.append([text_surface, x_position, y_position])
        frame_index = 0



        # 渲染弹幕直到所有弹幕离开屏幕
        while any(y > -text_surface.get_height() for _, _, y in barrage_list):
            screen.fill(bg_color)  # 清屏

            # 更新和绘制弹幕
            for i, (text_surface, x, y) in enumerate(barrage_list):
                text_rect = text_surface.get_rect(topleft=(x, y))
                screen.blit(text_surface, text_rect)
                # 更新弹幕位置
                barrage_list[i][2] -= move_speed

            # 保存帧
            pygame.image.save(screen, os.path.join(output_folder, f"frame_{frame_index:04d}.png"))
            frame_index += 1

        # 退出pygame
        pygame.quit()

    # 示例弹幕文本
    texts = [
" 控油去屑,终于找到救星了!",
"天然成分,用着放心,已回购!",
"滋润修护,受损发质变健康!",
"洗完头皮好舒服,无限回购!",
"性价比超高,值得购买!",
"洗发水中的佼佼者,必须点赞!",
"适合各种发质,全家都在用!",
"去屑效果显著,告别烦恼!",
"洗后不毛躁,顺滑到底!",
"持久留香,同事都问我用了啥!",
"温和无刺激,敏感肌也适用!",
"每次洗头都是享受,太棒了!",
"买对了洗发水,自信从头开始!",
"真心推荐,让你的头发焕发光彩!",
"用过最好用的洗发水,没有之一!",
"洗发水中的爱马仕,值得拥有!",
"一瓶解决多种头发问题,神奇!",
"想要秀发飘逸,选这款准没错!",

    ]
    render_barrage_list(texts)

效果实现

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

代码解析

  1. 初始化和设置:首先,我们初始化pygame并设置窗口大小和标题。
  2. 字体和字幕:我们使用pygame.font.Font来设置字体和大小,并渲染字幕内容。
  3. 字幕位置:通过get_rect()方法获取字幕的矩形区域,并设置其初始位置。
  4. 滚动逻辑:在游戏主循环中,我们不断更新字幕的y坐标,使其向上移动。当字幕完全移出屏幕顶部时,我们将其重置到屏幕底部。
  5. 绘制和更新:在每次循环中,我们先清屏,然后绘制字幕,并更新屏幕显示。

结语

通过上述步骤,我们成功创建了一个简单的由下向上滚动的字幕效果。这只是一个基础示例,你可以根据需要调整字幕的速度、颜色、字体等属性,甚至可以扩展功能,比如添加背景音乐、实现用户输入的动态字幕等。Python和pygame提供了强大的工具,可以帮助你实现各种创意效果。希望这个示例能为你的项目带来启发!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《2024中国泛娱乐出海洞察报告》解析,垂直且多元化方向发展!

随着以“社交”为代表的全球泛娱乐市场规模不断扩大以及用户需求不断细化,中国泛娱乐出海产品正朝着更加垂直化、多元化的方向发展。基于此,《2024中国泛娱乐出海洞察报告》深入剖析了中国泛娱乐行业出海进程以及各细分赛道出海现状及核心特征。针对中国…

qt QMediaPlaylist

QMediaPlaylist 是 Qt Multimedia 模块中的一个类,用于管理媒体文件的播放列表。它提供了一种方便的方式来组织和控制多媒体内容的播放,如音频和视频文件。 主要方法 QMediaPlaylist(00bject *parent nullptr):构造一个新的媒体播放列表对象。void add…

什么是分库分表?为什么要分库分表?什么时候需要分库分表?怎么样拆分?(数据库分库分表详解)

文章目录 1、什么是分库分表?1.1、分库分表的概念1.2、分库分表的方式1.2.1、垂直分库1.2.2、垂直分表1.2.3、水平分库1.2.4、水平分表 2、为什么要分库分表?3、什么时候需要分库分表?4、分库分表的数据路由4.1、数据路由的目的4.2、数据路由…

2024数学分析【南昌大学】

计算极限 lim ⁡ n → ∞ 2024 n ( 1 − cos ⁡ 1 n 2 ) n 3 1 + n 2 − n \mathop {\lim }\limits_{n \to \infty } \frac{{\sqrt[n]{{2024}}\left( {1 - \cos \frac{1}{{{n^2}}}} \right){n^3}}}{{\sqrt {1 + {n^2}} - n}} n→∞lim​1+n2 ​−nn2024 ​(1−cosn21​)n3​ …

桥接模式,外界与主机通,与虚拟机不通

一 二 在此选择Windows与外界连接的网卡,通过有线连就选有线网卡,通过无线连就选无线网卡。 三 如果需要设置固定IP,则选择"Manual"进行设置。我这边根据实际需要,走无线的时候用DHCP,走有线的时候设固定IP…

C#生成SVG文件(文本、线段、圆、椭圆、多边形的示例)

1. 介绍 一些参考博客: C#生成SVG涉及文字、线段、椭圆的示例 用C#解析渲染显示SVG矢量图转化格式保存 C#操作SVG矢量图-nuget库svg 开源库:https://github.com/svg-net/SVG 在NuGet上搜索SVG并安装: 2. 示例 引入的命名空间: …

初识算法 · 前缀和(1)

目录 前言: 一维数组的前缀和 题目解析 算法原理 算法编写 二维数组的前缀和 题目解析 算法原理 算法编写 前言: ​本文的主题是前缀和,通过两道题目讲解,一道是一维数组的模板,一道是二维数组的模板。 链接…

03 文件管理和IO重定向

1 文件系统目录结构 1.1 文件系统目录结构 文件系统的目录结构成树形结构一切文件的路径起点都是从根目录开始,用 / 表示文件名大小写敏感以 . 开头的文件都是隐藏文件路径通过 / 进行分割不同颜色的文件,它的类型是不同的每个文件都有两类数据&#xff…

S-Function

目录 S-Function介绍 生成S-Function的三种常用手段 使用手写S-函数合并定制代码 使用S-Function Builder块合并定制代码 使用代码继承工具合并定制代码 S-Function介绍 我们可以使用S-Function扩展Simulink对仿真和代码生成的支持。例如,可以使用它们&#xf…

初识Linux · 动静态库(incomplete)

目录 前言: 静态库 动态库 前言: 继上文,我们从磁盘的理解,到了文件系统框架的基本搭建,再到软硬链接部分,我们开始逐渐理解了为什么运行程序需要./a.out了,这个前面的.是什么我们也知道了。…

探索 Python 幽默之源:pyjokes 库全解析

🚀 探索 Python 幽默之源:pyjokes 库全解析 1. 背景介绍:为何选择 pyjokes? 在紧张的编程工作中,幽默是一种有效的缓解压力的方式。pyjokes 是一个专为程序员设计的 Python 库,它提供了丰富的单行笑话&am…

vscode配色主题与图标库推荐

vscode配色主题推荐:Andromedavsocde图标库: vscode-icons Andromeda Dark theme with a taste of the universe 仙女座:一套宇宙深空体验的哑暗色主题; 高对比度,色彩饱和; Easy Installation Open the extensions sidebar on Visual Studio CodeSear…

定时任务使用kafka

定时任务使用kafka 在上述业务场景中使用 Kafka 而不是直接定时执行任务有以下几个重要原因: 一、解耦 任务触发与执行分离: 使用 XXL-JOB 定时触发任务并将任务消息发送到 Kafka,实现了任务触发端(通常是调度系统)和…

C++,STL 049(24.10.26)

内容 pair的基本概念及构建方式。 运行代码 #include <iostream> #include <string>using namespace std;void test01() {// pair将2个数据组合成一组数据来使用&#xff08;first 、second&#xff09;// 注意pair的使用可以不添加头文件pair<string, int>…

Golang | Leetcode Golang题解之第501题二叉搜索树中的众数

题目&#xff1a; 题解&#xff1a; func findMode(root *TreeNode) (answer []int) {var base, count, maxCount intupdate : func(x int) {if x base {count} else {base, count x, 1}if count maxCount {answer append(answer, base)} else if count > maxCount {ma…

实验干货|电流型霍尔传感器采样设计02-有源滤波设计

在上一篇博客中&#xff0c;介绍了如何通过跨阻放大器&#xff0c;将霍尔输出的电流转换成电压。本篇博客继续介绍&#xff0c;如何将得到的电压进行滤波。 有源滤波和无源滤波的选择 简单来说&#xff0c;对于采样电路而言&#xff0c;无源滤波一般选择RC滤波&#xff0c;RC…

【K8S系列】Kubernetes Service 基础知识 详细介绍

在 Kubernetes 中&#xff0c;Service 是一种抽象的资源&#xff0c;用于定义一组 Pod 的访问策略。它为这些 Pod 提供了一个稳定的访问入口&#xff0c;解决了 Pod 可能频繁变化的问题。本文将详细介绍 Kubernetes Service 的类型、功能、使用场景、DNS 和负载均衡等方面。 1.…

使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理方便内网网站访问)【使用frp搭建内网穿透】

FRP&#xff08;Fast Reverse Proxy&#xff09;是一个高性能的反向代理应用程序&#xff0c;主要用于内网穿透。它允许用户将内部网络服务暴露到外部网络&#xff0c;适用于 NAT 或防火墙环境下的服务访问。 他是一个开源的 服务 如果大家不想用 花生壳 软件&#xff0c;可以尝…

遗传算法(Genetic Algorithm)理论详解

遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一种模拟自然界生物进化过程与机制的随机搜索与优化算法&#xff0c;被广泛应用于计算机科学、工程技术、经济学等众多领域。 1. 基本原理 1.1 生物遗传学类比 遗传算法的灵感来源于达尔文的进化论。在自然…

订购 Claude AI 的第二天 它独自完成 文字转语音 flask应用

图二里&#xff0c;删除几个无关的 chats 全程我做的工作&#xff1a;向 AI 提要求&#xff0c;copy / paste 代码&#xff0c;在venv验证运行&#xff0c;向 AI 反馈&#xff0c;总共用了3个 chats.&#xff08;图中的只有一个 Chat&#xff0c; 删掉的另外两个: Python 库安…