Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set background to subtitle in ffmpeg?

It is described here how ot burn a srt file into a video. However, I want to put a semi-transparent background to the subtitles so that the texts can be read more easily. How can I do that?

like image 483
supermario Avatar asked Sep 16 '14 13:09

supermario


People also ask

How do I add subtitles to ffmpeg?

FFmpeg uses the subtitles filter and the libass ↗ library to add SRT subtitles on top of the input video. The libass library is a portable subtitle renderer for the ASS subtitle format. It converts the input subtitle file to an ASS file. To use the libass library, you need to have libass enabled at compile time.

Can you convert PGS to SRT?

Just like when you extract subtitles from DVD, converting PGS to SRT, OCR (Optical Character Recognition) is a necessary process. Simply put, you need a third-party tool to identify the subtitles on the image and then transcribe it to text-based SRT subtitle files.


1 Answers

Using ASS subtitles to create opaque text background

ASS subtitles can have a semi-transparent background for the text.

With aegisub

The easiest way to do this is with aegisub.

enter image description here

  1. Open your subtitles file with aegisub.
  2. Click SubtitleStyles manager.
  3. Under Current Script choose Default, then press the Edit button.
  4. Experiment with the Outline and Shadow values. Check Opaque box.
  5. Under Colors click the color under Outline or Shadows. A window will appear. Adjust the value of the Alpha box to change transparency.
  6. Save the subtitles as an .ass file.

Now you can use the AAS file to make hardsubs or softsubs with ffmpeg.

Without aegisub

If you want hardsubs you can use the subtitles filter to add the transparent background with the force_style option.

ffmpeg -i input -filter_complex "subtitles=subs.ass:force_style='OutlineColour=&H80000000,BorderStyle=3,Outline=1,Shadow=0,MarginV=20'" output
  • This will work with any text based subtitles supported by FFmpeg because the filter will automatically convert them to ASS.

  • See SubStation Alpha (ASS) style fields for formatting options.

Issue with multiple lines

If your subtitles contains multiple lines, due to auto-wrapping of long lines or an intentional line break, the backgrounds will overlap and potentially look ugly as shown below:

enter image description here

You can avoid this by:

  1. Changing the Outline and Shadow sizes to 0.
  2. The alpha settings of the shadow will control the transparency of the background box. Click on the shadow color to adjust the Alpha of the shadow color to your desired transparency level.
  3. Edit the ASS file in a text editor. In the Style line change the value corresponding with BorderStyle to 4. This will fill the bounding box background of each subtitle event. Example Style line:

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

Example:

enter image description here

Note that BorderStyle=4 is a non-standard value, so it may not work properly in all players.

Thanks to sup and wm4 for the BorderStyle suggestion.

Using drawbox

The drawbox filter can be used to create a background box. This may be useful if you want the box to span the width.

enter image description here

ffmpeg -i input -filter_complex "drawbox=w=iw:h=24:y=ih-28:t=max:[email protected],subtitles=subs.ass" output

Downside is that you have to account for line breaks or word wrapping for long subtitles. Simply making the box taller to compensate will suffice, but will look ugly because the subtitles baseline remains static: the single line subtitles will have more padding on the top than the bottom.

like image 92
llogan Avatar answered Sep 18 '22 21:09

llogan