《FFmpeg Basics》中文版-10-为视频添加文字

news2024/11/25 14:55:54

正文

视频中包含的文本数据可以显着提高其信息质量。

在视频中添加文字的相关介绍

如何将一些文本添加到视频输出中的两种常用方法是使用前一章中的字幕或叠加技术(overlay)。 具有许多可能性的最高级选项是使用表中描述的抽象滤镜:

描述从文本文件或字符串在视频中添加文本,并使用各种参数进行修改。 文本从文本文件参数指定的文件中加载,或直接使用文本参数输入。 其他必需参数是指定选定字体的字体文件。 文本位置由x和y参数设置。
Syntaxdrawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[...]]]
p3,p4 ...表示参数#3,参数#4等
**********参数的描述
box如果box=1,在文本周围绘制一个方框,颜色由boxcolor参数设置,默认值为0
boxcolor颜色为box参数,颜色名称或0xRRGGBB[AA]格式(详见第1章的颜色名称),默认值为白色
draw表达式指定如果表达式求值为0时,是否应该绘制文本,则不绘制文本,默认为“1”。它用于指定只在特定条件下绘制文本。接受的变量和函数将在下一页和本章的内置数学函数中描述
fix_bounds如果是true,文本坐标是固定的,以避免剪切
fontcolor用于绘制字体、颜色名称或0xRRGGBB[AA]格式的颜色,默认为黑色
fontfile字体文件用于绘制文本的正确路径,强制参数
fontsize要绘制的文本字体大小,默认值为16
ft_load_flags用于加载字体的标志,默认值是“render”;更多信息在FT_LOAD_* libfreetype标志的文档中
shadowcolor在绘制的文本、颜色名称或0xRRGGBB[AA]格式后面绘制阴影的颜色,可能后面跟着一个alpha说明符,默认值是黑色
shadowx, shadowyx和y抵消了文本阴影位置对文本位置的影响,它们可以是正的,也可以是负值,两者的默认值是“0”
tabsize用于呈现选项卡的空间大小,默认值为4
timecodehh:mm:ss[:;]ff格式,可以使用或不使用文本参数,但必须指定timecode_rate参数
timecode_rate, rate, rtimecode帧率(仅限时间)
text要绘制的文本字符串,必须是UTF-8编码的字符序列,如果没有指定textfile参数,该参数是必需的
textfile文本文件与要绘制的文本,文本必须是一个UTF-8编码字符序列;如果不使用文本参数,则该参数是强制性的;如果指定了文本和文本文件参数,则显示一条错误消息
x, yx和y值是表示文本将在视频帧中绘制的偏移量的表达式;它们相对于左上角,而x和y的默认值为“0”;下面描述了接受的变量和函数
***********接受变量和函数表达式中的x和y参数
dar输入显示纵横比,与(w / h) * sar相同
hsub, vsub水平和垂直的色度子样本值。例如,像素格式的“yuv422p”hsub是2,而vsub是1
line_h, lh每个文本行的高度
main_h, h, H输入的高度
main_w, w, W输入的宽度
max_glyph_a, ascent从基线到最高/上格坐标的最大距离,用于放置一个字形轮廓点,用于所有呈现的字形;一个正值,由于网格
max_glyph_d, descent从基线到最低网格坐标的最大距离,用于放置一个字形轮廓点,用于所有呈现的字形;一个负值,由于网格
max_glyph_h最大字形高度,即所呈现文本中所包含的所有字形的最大高度,相当于上升下降
max_glyph_w最大的字形宽度,这是在呈现的文本中所包含的所有字形的最大宽度
n输入框的数目,从0开始
rand(min, max)返回最小值和最大值之间的随机数
sar输入样本比例
t时间戳以秒表示,如果输入时间戳未知
text_h or th呈现文本的高度
text_w or tw渲染文本的宽度
x, yx和y坐标,在这里文本被绘制,这些参数允许x和y表达式相互引用,所以你可以指定y=x/dar

例如,要在白色背景上使用黑色字体的Arial字体绘制一个受欢迎的消息(默认位于左上角),我们可以使用该命令(字符在一行上键入):

ffplay -f lavfi -i color=c=white ^ -vf drawtext=fontfile=/Windows/Fonts/arial.ttf:text=Welcome

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

  

在Linux上,TTF字体位于文件夹“/usr/share/字体/TTF”中。结果如下图:

我的测试命令如下:

ffplay -f lavfi -i color=white -vf drawtext=fontfile=/Library/Fonts/Baskerville.ttc:text=Welcome

显示的效果如图:

如果难以指定字体文件的路径,则可以将字体文件(例如arial.ttf)复制到当前目录,以便将前面的命令简化为表单:

ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcome
  • 这个我就不测试了,太简单了。。。。。。

使用ffmpeg的例子,省略“-f lavfi -i颜色=c=白色”,并包含输入和输出文件:

ffmpeg -i input -vf drawtext=fontfile=arial.ttf:text=Welcome output

我的测试命令如下:

 ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf drawtext=fontfile=/Library/Fonts/Baskerville.ttc:text=Welcome /Users/zhangfangtao/Desktop/newTest.mp4 

效果图如下:(在右上角,看到了么,特别小)

右上角,看到了么

为了关注其他参数,下面的示例将指定位于当前目录中的字体文件,您可以根据实际的字体文件位置来包含路径。

文本定位

文本位置设置为指定为需要值的x和y参数,这是可以包含变量的数学表达式,以及在上一页中描述的特殊的rand()函数

水平位置设置

水平文本放置是通过将x坐标设置为需要值来管理的,例如,从左侧放置文本40像素,我们使用x=40。表达式x=(w-tw)/2将文本定位到中心,其中tw为文本宽度,w为帧宽度。为了将文本对齐到右边,我们使用x=w-tw的表达式。

垂直位置设置

y坐标的设置决定了水平文本位置,例如,我们用y=50来定位文本50像素。表达式y=(h-th)/2将文本放置到中心,其中th为文本高度,h为帧高度。对于对齐到底部,我们使用表达式x=h

下一个示例文本在一个中心位置的视频帧,请注意,该文本包含空格或制表符必须被引号括起来,有时ffmpeg引擎也需要引用所有drawtext参数,所以所有参数的下一个命令使用双引号和单引号的文本参数(单引号和双引号可以交换,但不能混合):

ffplay -f lavfi -i color=c=white -vf ^ drawtext="fontfile=arial.ttf:text='Good day':x=(w-tw)/2:y=(h-th)/2"

我自己的测试命令:

ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=/Users/zhangfangtao/Desktop/Baskerville.ttc:text='Good day ,How are you?’:x=(w-tw)/2:y=(h-th)/2"

效果图:

image.png

字体大小和颜色设置

为了使文本更醒目、更有趣,使用了比默认16像素更大字体的彩色文本。使用其他参数fontcolor和fontsize,我们可以修改前面的例子,以30像素字体大小为中心的绿色文本“Happy Holidays”:

ffplay -f lavfi -i color=c=white -vf drawtext=^ "fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:^ fontcolor=green:fontsize=30"

我自己的测试命令:

ffply -f lavfi -i color=c=white -vf drawtext="fontfile=/Users/zhangfangtao/Desktop/Baskerville.ttc:text='Happy Holidys':x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30"

显示的效果:

为了改变背景色,从绿白到黄蓝,我们用蓝色的值替换白色,用黄色的值代替绿色,字体大小的值增加到40:

ffplay -f lavfi -i color=c=blue -vf drawtext=^ "fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:^ fontcolor=yellow:fontsize=40"

颜色也可以用HTML格式指定,例如红色=#ff0000,绿色=#00ff00,等等。

我的测试命令:

ffplay -f lavfi -i color=c=green -vf drawtext="fontfile=/Users/zhangfangtao/Desktop/Baskerville.ttc:text='Happy Holidys':x=(w-tw)/2:y=(h-th)/2:fontcolor=red:fontsize=40"

显示的效果:

动态文本

表示时间的t(时间)变量可以根据当前时间改变x和y值。

文字水平运动

要将文本横向移动到视频帧中,我们将t变量包括到x参数的表达式中,例如,在右向左方向以n个像素每一秒移动提供的文本,我们使用x=w-tn的表达式。为了将运动改变为从左到右的方向,使用x=w+tn的表达式。例如,要显示“动态RTL文本”字符串在顶部移动,我们使用命令。

ffmpeg -f lavfi -i color=c=#abcdef -vf drawtext=^ "fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:^ fontcolor=darkorange:fontsize=30" output

我的测试命令:

ffmpeg -f lavfi -i color=#abcdef -vf drawtext="fontfile=/Users/zhangfangtao/Desktop/Baskerville.ttc:text='Dynamic RTL Text':x=w-t*50:fontcolor=orange:fontsize=30" -t 15 /Users/zhangfangtao/Desktop/newTest.mp4 

效果图如下:

更常见的用法是在底部附近滚动一行文本,文本位于文本文件中,该文本文件只包含一条非常长的行。下一个示例使用带有值info.txt的textfile参数。

ffmpeg -f lavfi -i color=c=orange -vf drawtext="fontfile=arial.ttf:^ textfile=info.txt:x=w-t*50:y=h-th:fontcolor=blue:fontsize=30" output

信息的内容。txt文件如下,下面是在t=5时滚动的图片。

这是一个添加到橙色背景的文本,使用带有30像素字体大小的Arial字体的drawtext过滤器。

我的测试命令:

ffmpeg -f lavfi -i color=orange -vf drawtext="fontfile=/Users/zhangfangtao/Desktop/Songti.ttc:textfile=/Users/zhangfangtao/Desktop/test.rtf:x=w-t*50:y=h-th:fontcolor=blue:fontsize=30" -t 50 /Users/zhangfangtao/Desktop/newTest.mp4 

显示的效果:

垂直文本运动

文本垂直滚动从底部到顶部是常用的视频显示生产商的名称,演员,日期,等。文本垂直移动,t变量包含y参数的表达式,例如移动提供的文本每一秒×n像素从上到下,我们使用一个表达式y = t * n。从下到下滚动,使用y=h-t*n。下一个命令显示信用文件的内容,从底部向上移动,速度为每秒100像素。信用档案的内容,包括开始的空格处是:

ffmpeg -i palms.avi -vf drawtext="fontfile=arial.ttf:textfile=Credits:^ x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30" clip.mp4

我的测试命令:

ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf drawtext="fontfile=/Users/zhangfangtao/Desktop/Songti.ttc:textfile=/Users/zhangfangtao/Desktop/test.txt:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30" -t 100 /Users/zhangfangtao/Desktop/newTest.mp4

效果图:(从下往上滑动)

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

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

相关文章

成像雷达量产突破:木牛携手全球合作伙伴突破智驾瓶颈

时隔三年的全球工程机械行业大展,第33届2022德国慕尼黑Bauma展,于近期圆满收官。作为2022年为数不多的全球性展会,吸引了60多个国家和地区的3100余家工程机械企业聚首,行业新品竞相角逐,数字智能化的创新产品成为本次展…

最近公共祖先(lca)

题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N−1 行每行包含两个正整数 x,y,表示 x 结点和 y 结…

[附源码]java毕业设计景区门票系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

C# 通过字符串找对应名称的变量、Winform跨容器调用变量、递归遍历XML

C# 通过字符串找对应名称的变量、Winform跨容器调用变量、递归遍历XML 通过字符串,找对应名称的变量 ExceptionRecord er new ExceptionRecord();//新建类的对象(变量在这个类中) var fieldInfo er.GetType().GetField("Params"…

《Google软件工程之道》软件工程随想

写在之前:今年年初给自己安排了任务,每个月写一遍感悟性的文章。促使自己沉淀并思考。 这篇文章的内容本来只是一些想法, 想想还是记下来。几年以后自己再读这篇文章也许是另一种体会吧 编程和软件工程之间有三个关键的区别:时间、…

基于遗传算法的自主式水下潜器路径规划问题(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

2022/11/18拓展班上机课

Vs的使用 新建项目 新建源文件 关闭scanf_s和printf_s检查:project -> 属性 -> C/C -> 常规 ->SDL:否 char* str"..."出现”"const char *" 类型的值不能用于初始化 "char *" 类型的实体“错误&#xff…

2022.11.17补题祭

前言: 考完期中考试了!!生物逆袭了!!全年级前十(可能是因为题目太简单我比较细心吧)但还是错了一些不该错的题目......(生物惨痛87分) 感觉这次期中考试情况良好&#…

荧光标记PEG衍生物——Fluorescein-PEG-Azide,FITC-PEG-N3,荧光素peg叠氮

荧光标记PEG衍生物——Fluorescein-PEG-Azide,FITC-PEG-N3,中文名为荧光素-聚乙二醇-叠氮,其所属分类为Azide PEG Fluorescent PEG。 Fluorescein-PEG-Azide的分子量均可定制:荧光素-peg 20000-叠氮/Fluorescein-PEG 5000-Azide、…

47-用户和权限管理

47-用户和权限管理用户的管理和相关管理命令用户的基础概念用户UID区分用户类别创建用户- useradd修改用户- usermod删除用户- userdel修改用户密码- passwd实验:用户的管理文件用户组的基础概念用户组GID用户组分类创建组- groupadd修改组-groupmod删除组- groupde…

qt 样式表 qss

Qt样式表是一个可以自定义部件外观的十分强大的机制﹐除了那些能够通过子类化QStyle更改的外观,其余的都可以使用Qt样式表来美化。 实现办法:调用setStyleSheet 函数,其中styleSheet一般通过读取配置文件.qss实现。 void setStyleSheet(const QString&a…

volatile如何保证可见性

在Java中, volatile关键字可以保证变量的可见性,如果我们将变量声明为 volatile,这就指示 JVM,这个变量是共享且不稳定的,每次使用它都到主存中进行读取。 Java内存模型: 1.Java所有变量都存储在主…

关于java语言当中的this关键字

/*** 关于java语言当中的this关键字:(其内存图见下图)* 1、this是一个关键字,翻译为:“这个”* 2、this是一个引用,它是一个变量,this变量中保存的内存地址指向了自身,this存…

APISpace接口推荐

APISpace 上面有各种类型的API,短信类、天气环境类、快递物流类、数据智能类等等,并且所有的API都提供的免费的调用次数,这么多的API肯定有你中意的!!!我们超多的热门API推荐给大家: IP归属地A…

CUDA与cuDNN安装教程(超详细)

前言 windows10 和win11安装 CUDA ,首先需要下载两个安装包 CUDA toolkit(toolkit就是指工具包) cuDNN 用于配置深度学习使用 官方教程 CUDA:Installation Guide Windows :: CUDA Toolkit Documentation (nvidia.com) cuDNN&…

ADMIN云计算系统管理

云计算系统管理一、inux简介Unix/Linux发展史操作系统 —— UNICS,后改为UNIXLinux版本及应用Red Hat系列版本二、Linux系统的安装三、Linux预备知识Linux目录结构四、Linux基本操作获取命令行右键“打开终端”命令行提示符pwd — Print Working Directorycd — Cha…

01-微服务探讨(摘)

1. 前言 1.1 微服务目的 有效地拆分应用,实现敏捷开发和部署,最终的目标是实现敏捷开发和部署,实现的方式是围绕业务能力*有效地拆分应用*。 微服务就是从各种角度,包括组织的、技术的等来阐释怎样有效地拆分应用,相对…

SSM-Spring

Spring Framwork 1. 核心概念 1.1 IoC控制反转 inversion of control控制反转 使用对象是主动由外部提供对象,此过程对象创建控制权由程序转移到外部。 Spring 提供IoC容器,用来充当IoC思想中的外部。负责创建和初始化等工作,被创建的对象再…

04-HTTPS证书格式及转换

PEM格式的证书文件(*.pem)由Base64编码的二进制内容和开头行(-----BEGIN CERTIFICATE-----)、结束行(-----END CERTIFICATE-----)组成,支持使用EditPlus等文本编辑器打开。本文介绍了将不同格式…

[附源码]java毕业设计教室用电控制系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…