命令

固定水印

ffmpeg -i 1.h264 -filter:v drawtext="fontfile='D\:/hls/logo/stlitl.ttf':text='HelloWorld':fontcolor=yellow:fontsize=100:y=300:x=400" -y output.mp4

走马灯

ffmpeg -i 1.h264 -filter:v drawtext="fontfile=stlitl.ttf:text='Hello World':fontcolor=yellow@1.0:fontsize=100:y=h-th:x=w-tw-w/10*t" -y output2.mp4


参数

n 当前第n帧数据

t 当前播放时间秒

tw 渲染文本的宽度

th渲染文本的高度


源码


堆栈

ffmpegd.exe!draw_text(AVFilterContext * ctx, AVFrame * frame, int width, int height) 行 1421	C
 	ffmpegd.exe!filter_frame(AVFilterLink * inlink, AVFrame * frame) 行 1523	C
>	ffmpegd.exe!ff_filter_frame_framed(AVFilterLink * link, AVFrame * frame) 行 1071	C
 	ffmpegd.exe!ff_filter_frame_to_filter(AVFilterLink * link) 行 1219	C
 	ffmpegd.exe!ff_filter_activate_default(AVFilterContext * filter) 行 1268	C
 	ffmpegd.exe!ff_filter_activate(AVFilterContext * filter) 行 1429	C
 	ffmpegd.exe!ff_filter_graph_run_once(AVFilterGraph * graph) 行 1455	C
 	ffmpegd.exe!push_frame(AVFilterGraph * graph) 行 187	C
 	ffmpegd.exe!av_buffersrc_add_frame_internal(AVFilterContext * ctx, AVFrame * frame, int flags) 行 261	C
 	ffmpegd.exe!av_buffersrc_add_frame_flags(AVFilterContext * ctx, AVFrame * frame, int flags) 行 170	C
 	ffmpegd.exe!ifilter_send_frame(InputFilter * ifilter, AVFrame * frame) 行 2196	C
 	ffmpegd.exe!send_frame_to_filters(InputStream * ist, AVFrame * decoded_frame) 行 2270	C
 	ffmpegd.exe!decode_video(InputStream * ist, AVPacket * pkt, int * got_output, __int64 * duration_pts, int eof, int * decode_failed) 行 2469	C
 	ffmpegd.exe!process_input_packet(InputStream * ist, const AVPacket * pkt, int no_eof) 行 2623	C
 	ffmpegd.exe!process_input(int file_index) 行 4521	C
 	ffmpegd.exe!transcode_step() 行 4638	C
 	ffmpegd.exe!transcode() 行 4692	C
 	ffmpegd.exe!main(int argc, char * * argv) 行 4894	C
 	ffmpegd.exe!invoke_main() 行 79	C++
 	ffmpegd.exe!__scrt_common_main_seh() 行 288	C++
 	ffmpegd.exe!__scrt_common_main() 行 331	C++
 	ffmpegd.exe!mainCRTStartup() 行 17	C++
 	kernel32.dll!00007ffeb99c7c24()	未知
 	ntdll.dll!00007ffeb9c6d4d1()	未知


核心函数

static int draw_text(AVFilterContext *ctx, AVFrame *frame,
                     int width, int height)


tw计算代码

if (code == '\t') x  = (x / s->tabsize + 1)*s->tabsize;
        else              x += glyph->advance;

真正保存结果

max_text_line_w = FFMAX(x, max_text_line_w);

s->var_values[VAR_TW] = s->var_values[VAR_TEXT_W] = max_text_line_w;
s->var_values[VAR_TH] = s->var_values[VAR_TEXT_H] = y + s->max_glyph_h;

最终结果

tw = 416

th = 74

说明

tw和th跟字体和内容有关,不成比例