ffmpeg-drawtext

drawtext滤镜

就是在屏幕中绘制文字,有以下几个重要的参数:

  • expansion 文本扩展模式,默认normal
  • fontcolor 字体的颜色
  • fontcolor_expr 在expansion为normal的模式下,可以接受表达式,动态改变字体颜色,有以下函数
    • expr,e 它必须有一个参数来计算,接受计算x和y相同的常数和函数。注意并不是所有的常数都适合,例如text_w和text_h在此时还是一个未定义值(因为这两个值依赖于这里计算结果)
    • expr_int_format, eif 把表达式求值和输出格式化为整数。第一个参数是用于计算的表达式,就像是expr函数(包括了变量/常量等),第二个参数指定输出格式,允许‘x’, ‘X’, ‘d’ 和 ‘u’,其意义同于printf函数(C语言)中的意义。第三个参数是可选的,用来设置格式化为固定位数,左边可以用0来填补。
    • fontsize 字体大小
  • fontsize 字体大小
  • start_number 起始帧数,默认为0
  • text 文本内容,同样在expansion为normal的模式下,接受表达式
  • x,y 文本绘制区域的坐标偏移。是相对于图像top/left的值,接受表达式,有下面的常量或函数
    • line_h,lh 文本行高
    • main_h,h,H 输入的高
    • main_w,w,W 输入的宽
    • n 输入帧计数,从0开始
    • t 以秒为单位的时间计数
    • text_h,th 文本高
    • text_w,tw 文本宽

demos

  1. 在视频下方中部显示字幕

    1
    ffmpeg -y -loop 1  -t 10  -i a.png -c:v libx264 -vf "drawtext=text='This is a test':x=(w-tw)/2:y=3*(h-th)/4:fontsize=40:fontcolor=red:fontfile=SFMono-Regular.otf" -r 25  output1.mp4
  2. 移动字幕,从左边开始,每帧向右移动10个px

    1
    drawtext=text='This is a test':x=-tw+10*n:y=3*(h-th)/4:fontsize=40:fontcolor=red
  3. 旋转字幕

    单单一个滤镜是不支持旋转的。所以做法是取两个视频层,A层自身旋转,然后叠加到B层上面

    1
    2
    3
    4
    5
    6
    -filter_complex "\
    color=black:320x320,split[text][alpha];\
    [text][alpha]alphamerge,setsar=1,drawtext=text='ROTATE':fontcolor=#ff0000:fontsize=40,rotate=3*PI/8-15*PI*t/36:ow='min(iw,ih)*sqrt(2)':oh=ow:c=black@0[txta];\
    [0:v]scale=1280x720,setdar=16/9[v0];\
    [v0][txta]overlay=x=580:y=300:shortest=1[v1];\
    [v1]format=yuv420p[v]" \
  4. 字幕渐变效果,动态颜色

    text参数和fontcolor_expr 都是可以接受表达式的,从表达式来实现动态效果

    1
    2
    3
    4
    #改变透明度
    drawtext=text='ROTATE':fontcolor_expr=#ff0000@0.%{eif\\\\:if(gte(n\\,90)\\,99\\,10+n)\\\\:d\\\\:2}:fontsize=60:x='(w-tw)/2':y='3*(h-th)/4'
    #改变颜色
    drawtext=text='This is A Test,color\:ffff'%{eif\\\\:mod(10+2*n*n\\,255)\\\\:x\\\\:2}:fontcolor_expr=#ffff%{eif\\\\:mod(10+2*n*n\\,255)\\\\:x\\\\:2}:fontsize=60:x='(w-tw)/2':y='3*(h-th)/4'