[FFMPEG-AVFILTERS]文字

来源:互联网 发布:看淘宝 编辑:程序博客网 时间:2024/06/16 19:05

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:  边框厚度,默认值0bordercolor  边框厚度填充颜色,默认值"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 systemalpha  透明度,值范围为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_autohintshadowcolor  文本阴影颜色,默认值是"black".shadowxshadowy  阴影相对文本偏移量,它可以使正值,也可以时负值,默认是"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)xy  用于指定文本绘制的相对偏移坐标,参考点为左上角边缘,默认值为"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/shDS=1.0 # display startDE=10.0 # display endFID=1.5 # fade in durationFOD=5 # fade out durationffplay -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

4.结论

ffmpeg的drawtext滤镜能很好的满足我的需求,下一步就是研究如何编写代码

0 0
原创粉丝点击