moviepy音视频开发:使用credits1给视频加片头片尾字幕

2023-11-15

☞ ░ 前往老猿Python博文目录

一、概述

在《moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip类详解》介绍了TextClip生成文本剪辑的方法,文本剪辑可以用于制作字幕,作为片头片尾字幕介绍以及视频剪辑间的过渡内容。并在收费专栏文章《moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip及使用案例》中介绍了TextClip的案例。

而为了更方便的进行字幕能力支持,moviepy提供了一个工具函数credits1,用于支持将文本文件内容作为字幕剪辑,除了TextClip支持的能力外,还提供了一定的格式控制功能。

二、credits1介绍

2.1、credits1调用语法

credits1(creditfile, width, stretch=30, color='white', stroke_color='black', stroke_width=2, font='Impact-Normal', fontsize=60, gap=0)

2.2、参数说明:

  • creditfile:字幕文字存储的文本文件名
  • width:字幕文字的宽度,以像素为单位,老猿建议与准备加字幕的视频剪辑的宽度一样
  • stretch:官网没有该字段的说明,经阅读源码,这个参数在代码中暂时没有使用,估计是为了与以前版本兼容留下的参数
  • color:字幕文字的颜色,可以参考TextClip中对list和search方法对’color’的说明,具体参考在概述部分引用的博文
  • stroke_color:字幕文字轮廓线的颜色
  • stroke_width:字幕文字轮廓线的大小,像素为单位
  • font:字幕文字的字体,关于可用的字体可以使用TextClip的list(‘font’)查看,也可以直接指定字体文件
  • fontsize:字幕文字字体大小
  • gap:视频参与者角色和名字之间的水平间距,以像素为单位

2.3、返回值及其他补充说明:

  • credits1的返回值为一个ImageClip,没有设置fps和duration,如果与其他剪辑合成或单独输出,需要设置这2个属性
  • 字幕字体的中文支持需要关注TextClip中文支持的一个Bug,具体请参考《moviepy音视频剪辑:TextClip不支持中文字符以及OSError: magick.exe: unable to read font 仿宋_GB2312.ttf的解决办法
  • fontsize:经老猿验证,该值只是一个字幕文字的最大值,如在字幕足够宽时最大值为该参数指定值,当某一行文字过多按fontsize大小无法显示时,整个字幕的字体会自动调整大小以适应字幕的宽度
  • 使用credits1需要先下载并安装ImageMagick应用(不是Python模块)。安装ImageMagick后,还需要修改moviepy的config_defaults.py模块的配置,将下行代码:
IMAGEMAGICK_BINARY = os.getenv('IMAGEMAGICK_BINARY', 'auto-detect')

替换为:

IMAGEMAGICK_BINARY = r"C:\Program Files\ImageMagick-7.0.8-Q16\magick.exe"

具体的替换值需要确认ImageMagick安装目录进行更改。请参考前面概述部分引用博文的介绍。

  • 关于文本文件的格式控制说明:
  1. 空行控制:文本文件本身的空行会被忽略,credits1可以通过“.blank 行数n”控制显示n个空行,其中点和blank必须在行顶格写
  2. 参与者角色和名字(the jobs and the names)显示控制:“…”(两个连续的点)表示本行后面的文字为制片相关角色如制片人、导演等 (其实随便使用啦),在这种方式下,角色所在行文字靠左,并上移一行。所有靠左的行最长的行靠左顶格,其他靠左的行与该行右对齐
  3. 所有非靠左行都以所有靠左行结束位置左对齐,二者中间的间距由gap参数指定。(具体参考后面案例)

三、案例

3.1、案例说明

本案例读入一个文本文件将其转成一个字幕剪辑,与另一个视频剪辑拼接。文本文件中使用了格式控制符“.blank”和“..”。

3.2、案例的字幕文本文件

下面为老猿使用的文本文件内容,注意控制符的使用以及文字行前面的行号,以便于和字幕截屏对照看看格式符的作用:

.blank 4
1 查理·卓别林(Charlie Chaplin,1889416日—19771225日),生于英国伦敦,英国影视演员、导演、编剧。
2 查理·卓别林的第一部电影是《谋生》。从1915年开始卓别林开始自编自导自演,甚至还担任制片和剪辑。
3 稍后他加入了埃斯安尼公司,并于1917年出品了《移民》和《安乐街》
4 1918年他和他的兄弟在洛杉矶开了自己的公司。甚至还担任制片和剪辑
5 并在1919年召集到了道格拉斯·费尔班克斯等人。但直到1923年,卓别林才为这个公司拍了第一部影片《巴黎一妇人》。
6 之后1925年的《淘金记》和1928年的《马戏团》为卓别林赢得了学院奖。
7 1931年因为《城市之光》的首映卓别林来到伦敦,转年才返回,他的下一部影片是1936年的《摩登时代》。
8 四年之后他拍摄了《大独裁者》。1952年,他的有声电影《舞台生涯》上映,同年他移居瑞士。
9 1967年他拍摄了他的最后一部影片《香港女伯爵》,19771225日圣诞节早上于瑞士家中逝世,享年88岁。
.blank 4
..Executive Story Editor
12 MARCEL DURAND
..Associate Producers
14 MARTIN MARCEL
15 DIDIER MARTIN
..Music Supervisor
17 JEAN DIDIER
18 credits1测试
..老猿Python,跟老猿学Python!网址:
20 https://blog.csdn.net/LaoYuanPython
.blank 2
21 
22
23
24
25
26
27
28
29
..30
31
32
33
34
35
36
37
38

3.3、案例代码

from  moviepy.editor import *
from  moviepy.video.tools.credits import credits1 #导入工具credits1

if __name__ == '__main__':
    video = VideoFileClip(r"F:\video\zbl1.mp4") #加载视频文件

    imgClip = credits1(r"F:\video\test.txt", video.size[0], stretch=30, color='blue', stroke_color='red',
             stroke_width=2, font='fs_GB2312.ttf', fontsize=60, gap=10)#生成字幕剪辑
    imgClip = imgClip.set_duration(30).set_fps(video.fps) #给字幕剪辑设置播放时长和fps
    w, h = video.size
    x_speed = x_start = y_start = 0
    y_speed = 30
    print(imgClip.size, video.size)
    imgClip = imgClip.fx(vfx.scroll, h,w, x_speed, y_speed, x_start, y_start) #将字幕剪辑变成滚屏播放,注意h和w的顺序,具体可以参考专栏有关scroll的文章

    print(imgClip.size,video.size) 

    imgClipList = [imgClip, video]
    mixVideo = concatenate_videoclips(imgClipList,method='compose')

    imgClip.write_videofile(r"f:\video\img.mp4",fps=30)
    mixVideo.write_videofile(r"f:\video\mixVideo.mp4")

3.4、案例生成视频剪辑字幕截图在这里插入图片描述

四、小结

本文介绍了使用credits1给视频加字幕的功能,对credits1函数的语法、参数、返回值及使用注意事项进行了详细介绍,并介绍了credits1使用的字幕文本文件的格式控制方式,并提供了完整案例。大家可以通过本文的介绍熟练地使用credits1给视频加片头片尾字幕。上面案例对于文字轮廓线没有按预期处理,原因老猿暂时未进行深入分析,但总体上相关案例能对credits1的功能起到比较好的例证,大家可以结合前面介绍的内容对照代码和截屏理解一下。

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

关于收费专栏

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

收费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》,因总体内容不复杂,本文未单独设置收费专栏文章。

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

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

跟老猿学Python、学5G!

☞ ░ 前往老猿Python博文目录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

moviepy音视频开发:使用credits1给视频加片头片尾字幕 的相关文章

  • Django:ImageField 需要文件路径还是实际的图像对象?

    Running Windows 7 Python 3 3 Django 1 6 我对如何将图像存储为 Django 数据库中表的一部分感到困惑 有一个领域叫做ImageField 这是Docs https docs djangoprojec
  • numba.prange 性能不佳

    我试图整理一个简单的例子来说明使用的好处numba prange对于我自己和一些同事来说 但我无法获得像样的加速 我编写了一个简单的一维扩散求解器 它本质上是在一个长数组上循环 组合元素i 1 i and i 1 并将结果写入element
  • 在 Python 中打开 Alteryx .yxdb 文件?

    有没有办法将 yxdb Alteryx 数据库文件 导入到 Pandas Python 中 而不使用 Alteryx 作为中间人 简短的回答是否定的 目前还不行 更长的答案 yxdb 支持的原始 C 是可以在 github 上找到 http
  • 使用输入按钮处理网站上的分页

    试图使用硒抓取这个网站 我的代码可以工作 但目前它只抓取第一页 该页面使用输入按钮作为浏览页面的一种方式 因此我想逐个单击每个按钮 但它不起作用 有没有人有任何其他方法来处理此类分页的导航 import requests from sele
  • TypeError:无法在 re.findall() 中的类似字节的对象上使用字符串模式

    我正在尝试学习如何自动从页面获取网址 在下面的代码中 我试图获取网页的标题 import urllib request import re url http www google com regex r pattern re compile
  • PyPDF2 复制后返回空白 PDF

    def EncryptPDFFiles password directory pdfFiles success 0 Get all PDF files from a directory for folderName subFolders f
  • 加速 Numpy 数组上的循环

    在我的代码中 我有一个 for 循环 它对多维 numpy 数组进行索引 并使用每次迭代时获得的子数组进行一些操作 看起来像这样 for sub in Arr do stuff using sub 现在使用完成的东西sub是完全矢量化的 所
  • Python 字典不按顺序排列

    我创建了一个字母表字典 其值从0开始 并根据单词文件增加一定的量 我对最初的字典进行了硬编码 我希望它保持按字母顺序排列 但事实并非如此 我希望它按字母顺序返回字典 基本上与初始字典保持相同 我怎样才能保持秩序 from wordData
  • python-click:添加修改其他参数行为的选项

    这个问题是关于click http click pocoo org 5 包裹 Click 是一个用于创建漂亮命令行的 Python 包 使用尽可能少的代码以可组合的方式进行接口 它是 命令行界面创建工具包 它具有高度可配置性 但带有开箱即用
  • QFileDialog 作为 TableView 的编辑器:如何获取结果?

    我正在使用一个QFileDialog作为某些专栏的编辑QTableView 这基本上有效 对一些焦点问题取模 请参阅here https stackoverflow com questions 22854242 qfiledialog as
  • 正则表达式 - Python - 删除前导空格

    我使用正则表达式在文本文件中搜索 产品 一词 然后 我使用该搜索的起点和终点来查看该列并提取整数 有些实例 A 列 有我不想要的前导空格 我只想将数字 如 B 列中的数字 打印到文件中 没有前导空格 正则表达式中的正则表达式 有条件的 pr
  • 如何从 google place api for python 中的地点 id 获取地点详细信息

    我正在使用 Google Places API 和 Python 来构建一个食品集体智能应用程序 例如周围有哪些餐馆 他们的评级如何 营业时间是什么 等等 我正在Python中执行以下操作 from googleplaces import
  • 如何在Python中将字符串转换为包含一个元素的列表[重复]

    这个问题在这里已经有答案了 我有一个字符串 我想将其转换为其中只有一个元素的列表 a abc print list a output a b c Expected o p abc 正确的做法是什么 只需使用 a abc b a print
  • 在此异步设置中,我在哪里捕获 KeyboardInterrupt 异常

    我正在开发一个使用ccxt异步库 它要求通过显式调用该类的资源来释放某个类使用的所有资源 close 协程 我想退出程序ctrl c并等待异常中的关闭协程 然而 它永远不会被等待 该应用程序由模块组成harvesters strategie
  • 使用 South 更改 Django 模型列默认值

    我在 Django 项目中使用 South 和 Postgresql DB 我想更改一个模型字段的默认值以供继续使用 我不需要以前的记录 刚刚新记录 我是否需要为此进行迁移 或者只是更改模型 旧场详细信息 background style
  • 将 pandas DataFrame 写入 unicode 中的 JSON

    我正在尝试将包含 unicode 的 pandas DataFrame 写入 json 但是内置的 to json函数对字符进行转义 我该如何解决 Example import pandas as pd df pd DataFrame a
  • 识别左侧由 delta 链接的簇,右侧由不同 delta 链接的簇

    考虑排序后的数组a a np array 0 2 3 4 5 10 11 11 14 19 20 20 如果我指定了左增量和右增量 delta left delta right 1 1 这就是我期望的集群分配方式 a 0 2 3 4 5 1
  • Python - 函数无法在新线程中运行

    我正试图杀死notepad exe使用此函数在 Windows 上进行处理 import thread wmi os print CMD Kill command called def kill c wmi WMI Commands not
  • 如何使用 google.oauth2 python 库?

    我试图对谷歌机器学习项目的安全预测端点进行简单的休息调用 但它找不到 google oauth2 模块 这是我的代码 import urllib2 from google oauth2 import service account Cons
  • Python FFmpeg查询rtsp太慢

    目前 我正在尝试使用 python 和 FFmpeg 来查询原始格式为 h264 的 rtsp 数据 直播流视频的信息为 fps 29 分辨率 1280 720 我希望我可以以相同的格式 h264 查询数据并将其放入python队列中以便将

随机推荐

  • 7-21 求特殊方程的正整数解 (15分)

    本题要求对任意给定的正整数N 求方程X2 Y2 N的全部正整数解 输入格式 输入在一行中给出正整数N 10000 输出格式 输出方程X2 Y2 N的全部正整数解 其中X Y 每组解占1行 两数字间以1空格分隔 按X的递增顺序输出 如果没有解
  • kafka踩坑——java找不到kafka-run-class.sh: line 309: exec: java: not found

    今天执行 user 1 test 1 opt kafka sudo bin zookeeper server start sh config zookeeper properties opt kafka bin kafka run clas
  • Spring Boot应用篇-JSR参数校验定制

    Spring Boot应用篇 JSR参数校验定制 T1 前言 SpringBoot中默认提供了对JSR Java Specification Requests 注解的校验支持 但并没有对校验失败抛出的异常进行处理 该博文主要介绍个人对Spr
  • 解决Android Studio安装过程中“SDK tools directory is missing”的问题

    SDK tools directory is missing 这是因为安装时你的计算机无法连接到google的服务器 对google服务器的域名地址解析出问题了 无法从google服务器下载SDK tools 安装时自动跳过安装SDK to
  • switch语句格式_JavaScript流程控制语句_if语句(十一)

    目录 什么是流程控制语句 if语句的格式以及使用 一 什么是流程控制语句 JavaScript中的语句是从上到下一层一层执行的 通过流程控制语句可以控制程序执行的流程 使程序可以根据一定的条件来选择执行 使用条件判断语句可以在执行某个语句之
  • 华为云构建docker服务流程

    最近买了一个华为云服务器 配置不高适合学习 今天就从0开始从这个华为云服务器搭建我们自己的一个docker服务 安装docker 步骤1 更新系统软件包 sudo yum update 步骤2 添加docker存储库 sudo yum co
  • 前端开发工具DevTools的详细知识点总结(一)

    文章目录 打开DevTools 元素面板 Style面板 Computed面板 devtools取色器 控制台面板 基本功能介绍 控制台应用 网络面板 功能区介绍 分析请求 结语 打开DevTools devtools 即Chrome 开发
  • 《Java 并发编程实战》--读书笔记

    Java 并发编程实战 注 极客时间 Java 并发编程实战 读书笔记 GitHub https github com ByrsH Reading notes blob master Concurrency Java并发编程实战 极客时间
  • TYPE-C接口引脚详解

    Type C口有4对TX RX分线 2对USBD D 一对SBU 2个CC 另外还有4个VBUS和4个地线 1 当Type C接口仅用作传输DP信号时 则可利用4对TX RX 从而实现4Lane传输 这种模式称为DPonly模式 2 Typ
  • MFC之MessageBox、AfxMessageBox用法

    在软件中我们经常会弹出个小窗口 给一点点提示 这就会用到消息对话框 在Win32 API程序中只有MessageBox这一种用法 而在MFC中就有三各方法 1 调用API中的MessageBox 2 调用CWnd的成员函数MessageBo
  • PYQT5中QT Designer设置界面、按钮等背景图

    超级简单的新手教程 目录 文章目录 第一步 第二步 第三步 第一步 制作一个 qrc文件 在
  • python使用Axes3D画三维图加入legend图例时报错AttributeError: ‘Poly3DCollection‘ object has no attribute ‘_edgecolo

    Q python使用Axes3D画三维图加入legend图例时报错AttributeError Poly3DCollection object has no attribute edgecolors2d 报错源代码 fig plt figu
  • 计算机网络和因特网的基本认识

    计算机网络和因特网 笔者阅读 计算机网络 自顶向下方法 第七版第一章所作笔记如下 主要为计算机网络和因特网的基本认识 第一章概述笔记入口 第二章应用层笔记入口 第三章运输层笔记入口 第四章网络层数据平面笔记入口 1 什么是因特网 1 1 因
  • Git教程:标签

    实际上看到这边 对于Git分支仓库这些概念以及commit push pull等操作 但是有些东西我们可能常见到 但是不怎么经常用的 tag 标签其实就算一个 我们下载一些开源项目的时候 在GitHub上经常看到版本 有的项目是通过tag来
  • systemui

    一 SystemUI 概述 二 模块基本布局 三 模块内部框架 四 模块流程 五 重要文件的介绍 一 SystemUI 概述 1 Statusbar 的功能作用 1 1 状态栏的通知功能 包括时间 通知 系统状态等 1 2 状态栏的日期显示
  • VBA &金融

    汇总数据 算提成 G py 210523finance VBA专题12 课程需用材料 Sub Macro1 Dim ws As Worksheet Dim i As Integer For i 1 To 20 Set ws Sheets A
  • kotlin 中intent的传值应用

    main Activity fun intent position Int content String var intent Intent this MainActivity TestActivity class java var bun
  • org.apache.poi.ss.usermodel.Cell.setCellValue(Ljava/time/LocalDateTime;)V

    java 导出功能 出现错误的原因是 实体中存在日期 而导出的时候Excel无法转换日期类型 解决方法 在实体中将日期类型转换为String类型 ColumnWidth 25 ExcelProperty value 计划开始日期 index
  • 100道Python练习题集合,拿去刷

    看书 看视频都可以帮助你学习代码 但都只是辅助作用 学好Python 最重要的还是多敲代码 多刷题 不知道怎么找题刷题的小伙伴 可以看看小编今天带来的 Python100练习题 覆盖了基本语法 数据结构 算法等多个方面 100道Python
  • moviepy音视频开发:使用credits1给视频加片头片尾字幕

    前往老猿Python博文目录 一 概述 在 moviepy音视频剪辑 视频基类VideoClip子类DataVideoClip UpdatedVideoClip ImageClip ColorClip TextClip类详解 介绍了Text