ffmpeg实现动态调整字幕内容

最近在做一个项目,需要在视频上叠加图片和文字,而且是要能根据外部接口调整文字的内容,以及控制图片的位置。水印和字幕当然还是用ffmpeg的滤镜来实现了,变换文字内容也可以用drawtext的textfile来实现,但涉及到实时控制显示位置,就干脆一起使用改变滤镜参数的方法实现了。这篇文章里仅谈谈怎么修改字幕的文字内容,动态调整字幕和水印位置需要修改ffmpeg源码,我会在下一篇文章中讲如何实现。

滤镜使用的代码参见ffmpeg源码的doc/examples/filtering_video.c,滤镜的设置如下:

[in]drawtext=fontfile=arial.ttf:text=100:x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30,\
drawtext=fontfile=arial.ttf:text=123:x=200:y=200:fontcolor=green:fontsize=30[text];\
movie=./test.png[wm1];\
movie=./test.png[wm2];\
[text][wm1]overlay=10:10[out1];\
[out1][wm2]overlay=100:500[out]

这里加了两个字幕和两个水印,然后我们在滤镜初始化完之后,调用如下代码查看滤镜信息:

for (int i = 0; i < filter_graph->nb_filters; i++)
{
    AVFilterContext* filter_ctxn = filter_graph->filters[i];
    std::cout << filter_ctxn->name << std::endl;
}

可以看到输出如下:

in
out
Parsed_drawtext_0
Parsed_drawtext_1
Parsed_move_2
Parsed_move_3
Parsed_overlay_4
Parsed_overlay_5
auto_scaler_0
auto_scaler_1

从这里可以看出filter与命令之间的对应关系,然后我需要改变第一个字幕的文字内容,就需要首先得到第一个字幕对应的AVFilterContext,采用如下代码实现:

AVFilterContext* filter_ctx1 = filter_graph->filters[2];

然后在每次滤镜处理,即调用av_buffersrc_add_frame_flags之前,采用如下代码写入字幕要显示的文字,文字内容放在char数组str1中:

av_opt_set(filter_ctx1->priv, "text", str1, 0 );

然后正常调用av_buffersrc_add_frame_flags和av_buffersink_get_frame,这样更改的文字就更新到字幕中了

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值