命令
固定水印
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跟字体和内容有关,不成比例