使用 FFmpeg 仅在单个帧上绘制文本、绘制框或覆盖

发布于 2024-12-13 09:30:47 字数 618 浏览 0 评论 0原文

我在 FFmpeg 上使用 drawtextdrawbox avfilters,这是人类已知的文档记录最差的两个函数。

我正在努力弄清楚是否以及如何仅在单个帧上使用它们,即在第 22 帧上绘制文本。

当前命令:

ffmpeg -i test.wmv -y -b 800k -f flv -vcodec libx264 -vpre default -s 768x432 \
  -g 250 -vf drawtext="fontfile=/home/Cyberbit.ttf:fontsize=24:text=testical:\
  fontcolor=green:x=100:y=200" -qscale 8 -acodec libfaac -sn -vstats out.flv

提到的两个元素文档中的nt。但是,我似乎只能在 x 和 y 中使用它们。不是文本形式,甚至不是其他参数。

任何帮助或 FFmpeg 指导将不胜感激。

I'm using the drawtext and drawbox avfilters on FFmpeg, two of the most poorly documented functions known to man.

I'm struggling to work out if and how I can use them on only a single frame, i.e., drawtext on frame 22.

Current command:

ffmpeg -i test.wmv -y -b 800k -f flv -vcodec libx264 -vpre default -s 768x432 \
  -g 250 -vf drawtext="fontfile=/home/Cyberbit.ttf:fontsize=24:text=testical:\
  fontcolor=green:x=100:y=200" -qscale 8 -acodec libfaac -sn -vstats out.flv

Two elements mentioned in the documentation are n and t. However, I only seem to be able to use them in x and y. Not in text or even as other parameters.

Any help or FFmpeg guidance would be gratefully received.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

橙味迷妹 2024-12-20 09:30:47

在 FFmpeg 始终让您保持警惕的一个很好的例子中,这对于 drawtextdrawbox 非常痛苦。

关键是 drawtext 包含 draw 参数:

绘制
设置一个表达式来指定是否应绘制文本。如果表达式的值为 0,则不绘制文本。这对于指定仅在满足特定条件时才绘制文本非常有用。

因此,仅在第 22 帧上显示文本:

ffmpeg -i in.wmv -vf drawtext="fontfile=font.ttf:text='blah':draw='eq(n,22)'" out.flv

drawbox 没有 draw 参数,并且没有通用方法来模拟它,因此您只能执行诸如提取部分内容之类的操作您想要将盒子放在上面的视频,然后用偏移量覆盖它:(

ffmpeg -i in.wmv -t 1 -ss 10 -vf drawbox=10:10:20:20:red boxed.flv
ffmpeg -i in.wmv -itsoffset 10 -i boxed.flv -filter_complex overlay out.flv

尽管这将使 boxed.flv 的最后一帧永远可见)或将视频分成多个部分,在正确的部分,然后重新组合。

In a great example of FFmpeg always keeping you on your toes, this is trivial to do with drawtext and extremely painful with drawbox.

The key is that drawtext includes the draw parameter:

draw
Set an expression which specifies if the text should be drawn. If the expression evaluates to 0, the text is not drawn. This is useful for specifying that the text should be drawn only when specific conditions are met.

So to only show text on frame 22:

ffmpeg -i in.wmv -vf drawtext="fontfile=font.ttf:text='blah':draw='eq(n,22)'" out.flv

drawbox has no draw parameter, and there's no general way to emulate it, so you're left doing something like extracting the portion of video that you want to put the box on and then overlaying it with an offset:

ffmpeg -i in.wmv -t 1 -ss 10 -vf drawbox=10:10:20:20:red boxed.flv
ffmpeg -i in.wmv -itsoffset 10 -i boxed.flv -filter_complex overlay out.flv

(though this will leave the last frame of boxed.flv visible forever) or breaking up the video into multiple pieces, drawing on the proper pieces, and then recombining.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文