如何在ffmpeg中设置背景到副标题?

时间:2014-09-16 13:30:37

标签: ffmpeg subtitle

描述here如何将srt文件刻录到视频中。 但是,我想在字幕中加入半透明背景,以便更容易阅读文本。我怎么能这样做?

6 个答案:

答案 0 :(得分:12)

Using ASS subtitles to create opaque text background

ASS字幕可以为文本提供半透明背景。

使用aegisub

最简单的方法是使用aegisub

enter image description here

  1. 使用aegisub打开字幕文件。
  2. 点击SubtitleStyles manager
  3. Current Script下选择Default,然后按Edit按钮。
  4. 试用OutlineShadow值。查看Opaque box
  5. Colors下点击OutlineShadows下的颜色。将出现一个窗口。调整Alpha框的值以更改透明度。
  6. 将字幕另存为.ass文件。
  7. 现在您可以使用AAS文件制作hardsubs or softsubs with ffmpeg

    没有aegisub

    如果你想要硬拷贝,你可以使用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

    多行问题

    如果你的字幕包含多行,由于长行的自动换行或有意的换行符,背景会重叠并且可能看起来很丑,如下所示:

    enter image description here

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

    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
      
    4. 示例:

      enter image description here

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

      感谢 sup wm4 提出BorderStyle建议。

      使用drawbox

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

      enter image description here

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

      缺点是您需要为长字幕说明换行符或自动换行。简单地使盒子更高以进行补偿就足够了,但是看起来很难看,因为字幕基线保持静止:单行字幕在顶部比底部有更多的填充。

答案 1 :(得分:4)

使用您喜欢的尺寸的透明框和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是左上角的距离。

之后,您可以插入字幕。

答案 2 :(得分:1)

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

Subtitle transparent background

答案 3 :(得分:0)

ffmpeg -i input.mp4 -filter_complex "subtitles=input.srt:force_style='BackColour=&H80000000,BorderStyle=4,Fontsize=11'" output.mp4

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

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

答案 4 :(得分:0)

使用当前版本的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%透明的矩形框中, 即使字幕中有两行。

答案 5 :(得分:-1)

有同样的问题,没有找到好的答案。显然$interval(和ffmpeg知道如何将avconv格式应用于ass,如下所示:

srt

(将avconv -i in.mp4 -vf "subtitles=subtemp.sub.0.sub:force_style='Name=Default,Fontname=Arial,Fontsize=28,PrimaryColour=&Hffffff,SecondaryColour=&Hffffff,OutlineColour=&H44000000,BackColour=&H0,BorderStyle=3,Shadow=0'" out.mp4 替换为avconv应该有效,或接近它。

关于ass的进一步阅读,特别是看似重要的内容是ffmpegBackColour