【问题标题】:Overlaying text on video with required angle using FFMPEG使用 FFMPEG 在视频上以所需角度覆盖文本
【发布时间】:2016-07-11 11:55:22
【问题描述】:

我正在尝试使用 ffmpeg 在视频上叠加一些文本。我可以通过以下命令覆盖文本。

ffmpeg -i input1.mp4 -filter_complex "[0:v]transpose=2[anticlockwiserotated];[anticlockwiserotated]drawtext=fontfile=../../public/fonts/Roboto-Regular-webfont.ttf: text='Test Text':x=100: y=50: fontsize=36: fontcolor=white:[textapplied];[textapplied]transpose=1" output_video.mp4

它只允许我水平或垂直叠加。

但我想附加一些角度,比如 45 度。

为此,如果我将命令修改为

ffmpeg -i input1.mp4 -filter_complex "[0:v]rotate=45*PI/180[anticlockwiserotated];[anticlockwiserotated]drawtext=fontfile=../../public/fonts/Roboto-Regular-webfont.ttf: text='Test Text':x=100: y=50: fontsize=36: fontcolor=white:[textapplied];[textapplied]rotate=315*PI/180" output_video.mp4

通过这个我得到覆盖视频:

因为首先我将视频旋转 45 度,添加文本并将其恢复到原始位置。所以我正在失去边界。

请建议我在视频上以所需角度覆盖文本的最佳方法。

提前致谢。

【问题讨论】:

    标签: ffmpeg


    【解决方案1】:

    基本方法是在空白画布上生成文本,然后为文本生成一个 Alpha 层,旋转结果并将其覆盖在主视频上。

    在下面的命令中,a 应替换为角度。 drawtext 的坐标在覆盖中使用。根据文本的长度,如果您逆时针旋转它,其中一些可能会被剪掉。所以检查并相应地调整 Y 偏移量。

    ffmpeg -i input1.mp4 -filter_complex 
            "color=black:100x100[c];
             [c][0]scale2ref[ct][mv];
             [ct]setsar=1,drawtext=fontfile=../../public/fonts/Roboto-Regular-webfont.ttf:
                 text='Test Text':fontsize=36:fontcolor=white,split[text][alpha];
             [text][alpha]alphamerge,rotate=a:ow=rotw(a):oh=roth(a):c=black@0[txta];
             [mv][txta]overlay=x='min(0,-H*sin(a))+100':y='min(0,W*sin(a))+50':shortest=1"
          output_video.mp4
    

    【讨论】:

    • 这真的很有用,还有一个小疑问,我们可以在文本中添加粗体或斜体效果吗...并且可以在特定时间段添加文本。我的意思是仅从视频的第 10 秒到第 20 秒,其余视频应该没有文字。
    • 对于选择性计时,将enable='between(t,10,20)'添加到drawtext。您可以为该样式使用粗体或斜体 TTF。
    • 您好,轮换似乎有些地方我做错了。请检查此命令一次 "ffmpeg -i input1.mp4 -filter_complex "color=black:100x100[c];[c][0]scale2ref[ct][mv];[ct]setsar=1,drawtext=fontfile=. ./../public/fonts/Roboto-Regular-webfont.ttf:text='测试文本':fontsize=36:fontcolor=white,split[text][alpha];[text][alpha] alphamerge,rotate= 55:ow=rotw(55):oh=roth(55):c=black@0[txta];[mv][txta]overlay=x='min(0,-Hsin(55)) +100':y='min(0,Wsin(55))+50':shortest=1" output_video.mp4"。通过这个,我几乎得到 90 度,但意图是得到 55 度。请指导我哪里做错了。
    • 角度必须是弧度,所以 55 度 = a = 55*PI/180
    • @gone 您只需在第一个用逗号分隔的过滤器之后立即添加另一个绘制文本过滤器。
    【解决方案2】:

    一种方法是使用带有 FFmpeg subtitlesass 过滤器的 ASS 或 SRT 字幕。

    ffmpeg -i input -filter_complex "subtitles=diagonal.ass" output
    

    SRT 字幕比 ASS 简单很多,不支持轮播,不过可以手动加滤镜:

    ffmpeg -i input -filter_complex "subtitles=diagonal.srt:force_style='Angle=45'" output
    

    您可以使用Aegisub 或手动创建和设置字幕样式。

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 1970-01-01
      • 2019-07-13
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      相关资源
      最近更新 更多