【问题标题】:How to set background to subtitle in ffmpeg?如何在ffmpeg中为字幕设置背景?
【发布时间】:2014-11-10 06:51:10
【问题描述】:

描述了here 如何将 srt 文件刻录成视频。 但是,我想为字幕设置半透明背景,以便更轻松地阅读文本。我该怎么做?

【问题讨论】:

    标签: ffmpeg subtitle


    【解决方案1】:

    ASS 字幕可以有一个半透明的文本背景。

    使用 aegisub

    最简单的方法是使用aegisub

    1. 使用 aegisub 打开您的字幕文件。
    2. 点击SubtitleStyles manager
    3. Current Script 下选择Default,然后按Edit 按钮。
    4. OutlineShadow 值进行实验。检查Opaque box
    5. Colors 下单击OutlineShadows 下的颜色。将出现一个窗口。调整Alpha 框的值以更改透明度。
    6. 将字幕另存为.ass 文件。

    现在您可以使用 AAS 文件制作hardsubs or softsubs with ffmpeg

    没有aegisub

    如果你想要hardsubs,你可以使用subtitles filter通过force_style选项添加透明背景。

    ffmpeg -i input -filter_complex "subtitles=subs.ass:force_style='OutlineColour=&H80000000,BorderStyle=3,Outline=1,Shadow=0,MarginV=20'" output
    
    • 这适用于 FFmpeg 支持的任何基于文本的字幕,因为过滤器会自动将它们转换为 ASS。

    • 有关格式选项,请参阅 SubStation Alpha (ASS) style fields

    多行问题

    如果您的字幕包含多行,由于长行的自动换行或故意换行,背景将重叠并可能看起来很难看,如下所示:

    您可以通过以下方式避免这种情况:

    1. OutlineShadow 大小更改为0
    2. 阴影的 alpha 设置将控制背景框的透明度。点击阴影颜色,将阴影颜色的Alpha调整为您想要的透明度级别。
    3. 在文本编辑器中编辑 ASS 文件。在Style 行中,将BorderStyle 对应的值更改为4。这将填充每个字幕事件的边界框背景。示例Style 行:

      Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H80000000,&H80000000,-1,0,0,0,100,100,0,0,4,0,0,2,10,10,10,1
      

    例子:

    请注意,BorderStyle=4 是一个非标准值,因此它可能无法在所有播放器中正常工作。

    感谢 supwm4BorderStyle 建议。

    使用画框

    drawbox filter 可用于创建背景框。 如果您希望框跨越宽度,这可能很有用。

    ffmpeg -i input -filter_complex "drawbox=w=iw:h=24:y=ih-28:t=max:color=black@0.4,subtitles=subs.ass" output
    

    缺点是您必须为长字幕考虑换行或自动换行。简单地让盒子变高来补偿就足够了,但看起来很难看,因为字幕基线保持不变:单行字幕顶部的填充比底部多。

    【讨论】:

    • 这会在两行字幕的情况下留下令人讨厌的一行。有没有办法摆脱它?
    • @sup 我不知道。另一种方法是使用drawbox filter 制作一个静态的透明框,但这也不是想法。
    • @eusoubrasileiro 很高兴听到。请注意“多行可能重叠并看起来很丑”的问题。 IIRC,这是 libass 的问题。某处有关于它的错误报告。
    • @sup 如果我没记错的话,它是在Aegisub Bug Tracker 上,但它目前已关闭。
    • @LordNeckbeard 实际上,设置 BorderStyle=4 可以解决问题(请参阅我打开的 Github 问题),请您更新您的答案吗?不过它只适用于 libass。
    【解决方案2】:

    以您喜欢的大小创建一个带有透明框和 Alpha 通道的 png。您可以使用例如gimp 或 Photoshop。

    然后使用这个命令:

    ffmpeg -i video.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=10:10" \
    -codec:a copy out.mp4
    

    其中 10:10 是到左上角的距离。

    之后您可以插入字幕。

    【讨论】:

    • 如果你想这样做“制作一个单独的背景框”方法,只使用drawbox过滤器会更容易和更有效。此外,使用过滤器(例如叠加层或绘图框)将需要对视频进行重新编码,但如我的回答中所示,对软字幕使用 ASS 字幕不会修改视频。
    【解决方案3】:

    您可以使用this Aegisub 脚本。该脚本自动为每一行字幕生成透明背景。

    【讨论】:

      【解决方案4】:
      ffmpeg -i input.mp4 -filter_complex "subtitles=input.srt:force_style='BackColour=&H80000000,BorderStyle=4,Fontsize=11'" output.mp4
      

      BackColour=&H80000000 表示具有 %50 不透明的黑色背景。

      它是颜色的十六进制表示,AABBGGRR。

      【讨论】:

        【解决方案5】:

        使用当前版本的libass(0.15)和当前版本的ffmpeg(N-100402-g0320dab265,从源代码编译,可能与4.2版本相同),你可以使用这个bash脚本

        INFILE="movie.mp4"
        SUBS="subtitles.srt"
        OUTFILE="result.mp4"
        ffmpeg -i "${INFILE}" -vf subtitles=${SUBS}:force_style='Borderstyle=4,Fontsize=16,BackColour=&H80000000'" "${OUTFILE}"
        

        将 subtitles.srt 刻录成 movie.mp4 并保存为 result.mp4。

        字幕将正确显示在一个 50% 透明的矩形中, 即使字幕中有 2 行。

        【讨论】:

          猜你喜欢
          • 2020-10-27
          • 2015-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-05
          • 2017-10-04
          • 1970-01-01
          • 2012-02-02
          相关资源
          最近更新 更多