1.研究可行性:
<1>针对实时流;
<2>可实现文字平滑滚动;
<3>文字大小,颜色,字体可更改;
<4>背景框颜色,透明度,大小可更改;
参考 http://ffmpeg.org/ffmpeg-all.html#drawtext-1
2.第三方库:
2.1.完善支持drawtext滤镜所需要使能的库:
--enable-libfreetype 画字库
--enable-libfribidi 字幕形状相关
--enable-libfontconfig 字体库
2.2.安装第三方库:
apt install *fontconfig*
apt install *fribidi*
3.参数:
3.1.box参数:
box:
是否启用背景框,默认值0-不启用;
boxborderw:
边框宽度,默认值0;
boxcolor:
边框颜色,默认为"white"
line_spacing
边框与边界的行距离
borderw:
边框厚度,默认值0
bordercolor
边框厚度填充颜色,默认值"black"
expansion
文本内容扩展方式,可能值为 none, strftime (不推荐使用) 或 normal (默认),详细见"Text expansion"
fix_bounds
是否采用固定坐标.若是,应该严格检查坐标,避免字幕被裁剪(其实是未显示)
3.2.text参数:
fontcolor
字体颜色,默认为 "black"
fontcolor_expr
扩展字体串的字体颜色,默认不设置.若设置,则将覆盖fontcolor的设置.
font
字体,默认为Sans.和fontfile选项2设置1即可
fontfile
字体库文件.若未使能fontconfig,则必须包含该选项.
draw
This option does not exist, please see the timeline system
alpha
透明度,值范围为0.0到1.0之间.,默认值为1.The expression accepts the same variables x, y as well.
fontsize
字体大小,默认值16.
text_shaping
若值为1,将尝试去修改文字(如:翻转),默认值为1.
ft_load_flags
加载字体的标志,默认值为"default",更多信息参考FT_LOAD_* libfreetype 标志,可能值如下:
default
no_scale
no_hinting
render
no_bitmap
vertical_layout
force_autohint
crop_bitmap
pedantic
ignore_global_advance_width
no_recurse
ignore_transform
monochrome
linear_design
no_autohint
shadowcolor
文本阴影颜色,默认值是"black".
shadowx
shadowy
阴影相对文本偏移量,它可以使正值,也可以时负值,默认是"0".
text
绘制的文本的内容,必须是UTF-8编码,若没有指定textfile,则必须指定该选项.
textfile
绘制的文本的内容,必须是UTF-8编码,若没有指定text,则必须指定该选项.若同时指定了text和textfile,将会出错.
reload
若设置为1,textfile将会在每帧自动加载. 要确保自动更新,否则可能引起只读取部分,甚至失败
3.3.其他参数:
start_number
n/frame_num中的起始帧号,默认值"0".
tabsize
The size in number of spaces to use for rendering the tab. 默认值是4.
timecode
设置初始的timecode,格式为"hh:mm:ss[:;.]ff",必须指定timecode_rate选项.
timecode_rate, rate, r
设置timecode的帧率(只适用于timecode)
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
用于放置一个字形从基线到最高网格坐标的距离,在Y轴上它是一个正数
max_glyph_d, descent
用于放置一个字形从基线到最低网格坐标的距离,在Y轴上它是一个负数
max_glyph_h
max_glyph_w
字形的最大高度和宽度
n
输入视频的帧数,由0开始
rand(min, max)
返回一个介于min和max的随机值
sar
输入视频采样的宽高比
t
时间戳,单位s。未知,使用NAN表示
text_h, th
text_w, tw
文本的高度和宽度
x
y
文本的坐标,它们可以互相引用,如y=x/dar
3.例
3.1.
使用字体FreeSerif绘制"Test Text"
drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text'"
3.2.
使用字体FreeSerif,字体大小24,位置为(100,50),文字颜色为黄色,边框颜色为红色,且文字和边框的透明度为20%.
drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text': x=100: y=50: fontsize=24: fontcolor=yellow@0.2: box=1: boxcolor=red@0.2"
注意:若参数列表中无空格,则可以不使用双引号.
3.3.
在视频正中显示文字:
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=(h-text_h)/2"
3.4.
每隔30秒,随机显示一段文字:
Show the text at a random position, switching to a new position every 30 seconds:
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=if(eq(mod(t\,30)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(t\,30)\,0)\,rand(0\,(h-text_h))\,y)"
3.5.
在视频最后一行上从左到右显示一行文字,假设文字内容(LONG_LINE)中不包含任何的换行符
drawtext="fontsize=15:fontfile=FreeSerif.ttf:text=LONG_LINE:y=h-line_h:x=-50*t"
3.6.
从视频底部往上滚动文字行(CREDITS)
drawtext="fontsize=20:fontfile=FreeSerif.ttf:textfile=CREDITS:y=h-20*t"
3.6.
在视频中央显示单词"g".字形基线为半个视频高度.
drawtext="fontsize=60:fontfile=FreeSerif.ttf:fontcolor=green:text=g:x=(w-max_glyph_w)/2:y=h/2-ascent"
3.7.
每隔3秒显示1秒文字
drawtext="fontfile=FreeSerif.ttf:fontcolor=white:x=100:y=x/dar:enable=lt(mod(t\,3)\,1):text='blink'"
3.8.
使用fontconfig来设置字体.
drawtext='fontfile=Linux Libertine O-40\:style=Semibold:text=FFmpeg'
3.9.
打印实时编码时间
drawtext='fontfile=FreeSans.ttf:text=%{localtime\:%a %b %d %Y}'
3.10.
设置文本淡入淡出:
#!/bin/sh
DS=1.0 # display start
DE=10.0 # display end
FID=1.5 # fade in duration
FOD=5 # fade out duration
ffplay -f lavfi "color,drawtext=text=TEST:fontsize=50:fontfile=FreeSerif.ttf:fontcolor_expr=ff0000%{eif\\\\: clip(255*(1*between(t\\, $DS + $FID\\, $DE - $FOD) + ((t - $DS)/$FID)*between(t\\, $DS\\, $DS + $FID) + (-(t - $DE)/$FOD)*between(t\\, $DE - $FOD\\, $DE) )\\, 0\\, 255) \\\\: x\\\\: 2 }"
3.11.
文字对齐.注意:max_glyph_a和字体大小也包含在y偏移中
drawtext=fontfile=FreeSans.ttf:text=DOG:fontsize=24:x=10:y=20+24-max_glyph_a,
drawtext=fontfile=FreeSans.ttf:text=cow:fontsize=24:x=80:y=20+24-max_glyph_a