50

Are there any open source, command line, subtitle converters - preferably for Linux?

10 Answers 10

65

You can try FFmpeg (great tool !) :

$ ffmpeg -i file.srt file.vtt
5
  • 10
    That tool can convert anything :)
    – IvanP
    Jul 26, 2020 at 15:29
  • @IvanP Apparently not ttml to $x$, though :(
    – DUO Labs
    Mar 6, 2021 at 20:32
  • keeps surprising me every time! Sep 20, 2021 at 21:18
  • Open source, command line and supports many more formats than FFmpeg - github.com/mantas-done/subtitles
    – Mantas D
    Aug 15, 2023 at 11:53
  • Not that STYLE in vtt format is not supported. Doing the reverse conversion leads to an empty file.
    – Amessihel
    Dec 28, 2023 at 23:38
19

very simple and effective oneliner i use to convert subtitles:

for i in *.ass ; do ffmpeg -i "$i" "$i.srt" ; done

just change ass and srt according to your needs.

1
  • 5
    for i in *.ass ; do ffmpeg -i "$i" "${i%.*}.srt" ; done
    – Sxilderik
    Nov 25, 2020 at 18:13
8

Subtitles perl swiss army knife (scroll to the end of the page).

Here you can find more options.

Also, mplayer/mencoder has some dumpXXXsub options, which might work. I never tried this, but reading the man, it should work. Example:

-dumpmpsub (MPlayer only)
              Convert the given subtitle (specified with the -sub option) to MPlayer's subtitle format, MPsub.  Creates a dump.mpsub file in the current directory.
3
  • Indeed this is handy, sadly though only three different formats are supported; .srt, .sub, .smi.
    – Johnas
    Mar 9, 2010 at 15:31
  • I checked the Mplayer and Mencoder out. Didnt get it working though. And it supports only SRT, SMI, SUB and JACO. A good suggestion though, thanks.
    – Johnas
    Mar 9, 2010 at 16:27
  • Works nice, thanks! Here: pastebin.com/T6DM9xbq is my converter based on this with framerate detection using mplayer Sep 4, 2012 at 15:29
6

The open source program Subtitle Edit has a command line converter and is available for both Windows and Linux.

Syntax: SubtitleEdit /convert "pattern" "name-of-format-without-spaces"

Example 1: SubtitleEdit /convert sub1.srt sami
Result: Will convert sub1.srt to sub1.sub to SAMI format

Example 2: SubtitleEdit /convert *.srt adobeencore
Result: Will convert all .srt files to Adobe Encore format

For Linux the command line needs to be slightly longer…

Syntax: mono SubtitleEdit.exe /convert "pattern" "name-of-format-without-spaces"

…but could easily be wrapped in a script.

4
  • The GUI works, but I got an error when running from the command line.. .I needed to install libmono-winforms for the GUI to work (as stated in the README)... Maybe there is something extra which is needed for the CLI to work... I get an AttachConsole... error. using Ubuntu 10.04 ...
    – Peter.O
    Jan 6, 2012 at 23:12
  • This seems to be fixed in version 3.2.3 - at least on Ubuntu
    – Johanz
    Jan 15, 2012 at 10:29
  • 1
    @Johanz: Thanks. Version 3.2.3 works. It converted a .ass to SubRip (.srt) ... Just one thing I notieced: it produces \r\n (CRLF) line endings, even when the source line-ending is \n ... but that would rarely be a problem and is easily fixed with sed if need be.
    – Peter.O
    Jan 27, 2012 at 17:09
  • +1 as this is a really good converter and an open source application. And it has a cmd line interface.
    – user10607
    Sep 11, 2015 at 19:57
3

I found that some players (e.g., Google Drive video player) do not like the .srt generated from:

ffmpeg -i subtitles.ass <blah>.srt

or:

SubtitleEdit /convert subtitles.ass subrip

but:

ffmpeg -i subtitles.ass -codec:s text subtitles.srt

...did the trick for me.

1

What is it you want to convert exactly? If it is between subtitle formats then it depends on which formats you are talking about. Those which are bitmap based will require OCR to convert to text format and generally always require user input for confirming the accuracy of the OCR

If it is all text formats then Jubler or Aegisub may be of use

3
  • Simple text subtitles. SRT, STL, SUB, PAC. Back and forth.
    – Johnas
    Mar 9, 2010 at 15:24
  • @johnas - my answer updated with a couple of possibilities
    – Shevek
    Mar 9, 2010 at 16:06
  • Thanks Shevek, but none of the above was command line operational. Though they would've been perfect if I could use the GUI.
    – Johnas
    Mar 9, 2010 at 16:20
0

rename the file name using sed

for i in ./*.ass ; do ffmpeg -i "$i" "$( echo "$i"|sed 's/\.ass//g' ).srt" ; done

if you want to delete the .srt file after converting, just add a rm command afterwards.

for i in ./*.ass ; do ffmpeg -i "$i" "$( echo "$i"|sed 's/\.ass//g' ).srt"  &&  rm -f "$i"  ; done
1
  • 2
    What if the file name is big.assassins.assured (plus the extension)? Your sed will name it bigassinsured. Without sed and without this flaw: "${i%.ass}.srt". Jul 24, 2019 at 7:58
0
#!/bin/bash

file="*.srt"                     # Find file
ffmpeg -i "$file" "${file%.*}.vtt"   # Convert file  
rm "$file"                         # Remove file .srt from your dir

if you want to convert more file using this program in for loop.

2
  • 2
    What if Ffmpeg aborts?
    – 174140
    Aug 25, 2019 at 11:08
  • ffmpeg is open source multimedia library.
    – Tamil
    Aug 25, 2019 at 11:13
0

With Windows batch file, you could use this to convert all text-subtitle files in folder to SRT

for %%i in (*.vtt .ass .ssa) do ffmpeg -i "%%i" "%%~ni.srt"
0

For converting the whole directory and also changing the extension of every file. You can use find command and combined it with ${%.*} to remove the .srt and use the new extension .vtt with this one-line command.

find . -name "*.srt" -exec bash -c 'ffmpeg -i {} "${0%.*}$1" ' {} ".vtt" \;

The reason to call bash is to use the ${0%.*} to find basename.

The {} after ffmpeg -i {} "${0%.*}$1" is the argument $0 that send into the ffmpeg command.

The ".vtt" is the argument $1.

So ${0%.*}$1 became basename.vtt

Not the answer you're looking for? Browse other questions tagged .