How do I add and/or keep subtitles when converting video?

108,405

Solution 1

Well I found a way to make it work, not ideal, but it works. I can add a srt to a video with mkvmerge. Only downfall is it makes the video mkv, not mp4.

Solution 2

Softsubs

MP4 supports streaming text format subtitles, but playback support for this among players and devices is not universal.

Basic example using default stream selection behavior while stream copying the audio:

ffmpeg -i input.mkv -c copy -c:s mov_text output.mp4

Example to stream copy all of the video and audio streams, convert the all text based subtitle input streams (SRT, ASS, VTT, etc) to the streaming text format, and set the language for the first two subtitle streams.

ffmpeg -i input.mkv -map 0 -c copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:1 language=ipk output.mp4

Same as above but re-encode the video and audio to formats compatible with the MP4 container (H.264 video:

ffmpeg -i input.mkv -map 0 -c:v libx264 -c:a aac -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:1 language=ipk output.mp4

Same as above but use the -map option to choose the first video stream, second audio stream, and third subtitle stream:

ffmpeg -i input.mkv -map 0:v:0 -map 0:a:1 -map 0:s:2 -c:v libx264 -c:a aac -c:s mov_text -metadata:s:s:0 language=eng output.mp4

Hardsubs

Text based subtitle format inputs

Use the subtitles filter to "burn-in" text based subtitle formats (SRT, ASS, VTT, etc). Note that this requires re-encoding, so it will by much slower than using softsubs.

Basic example using default stream selection behavior while stream copying the audio:

ffmpeg -i input.mkv -filter_complex "subtitles=input.mkv" -c:a copy output.mp4

Example to use the third video stream, fifth subtitle stream, and first audio stream:

ffmpeg -i input.mkv -filter_complex "[0:v:2]subtitles=input.mkv:si=4[v]" -map "[v]" -map 0:a:0 -c:a copy output.mp4

Example for a separate subtitle input file (your-subtitles-file.srt):

ffmpeg -i input.mp4 -filter_complex "subtitles=your-subtitles-file.srt" -c:a copy output.mp4

Image based subtitle format inputs

Use the overlay filter. This example will overlay the fourth subtitle stream over the second video stream, and stream copy the seventh audio stream:

ffmpeg -i input.mkv -filter_complex "[0:v:2][0:s:3]overlay[v]" -map "[v]" -map 0:a:6 -c:a copy output.mp4

Also see

Solution 3

You can use -map 0 to ensure that all streams are copied. If it is not possible with the format, FFmpeg should then error out.

-map 0 tells ffmpeg/libav to include all streams, not just those for which you defined conversion rules.

Normally, -map is used to define stream mapping – e.g. stream 1 in the input should become stream 0 in the output. With just -map 0 you tell ffmpeg/libav to take all streams without shuffling.

Solution 4

If you just want to do a simple conversion to mp4 you can use VLC. VLC will accept a subtitles file and render it onto the output.

For more complicated conversions, including styling the subtitles, you can use OpenShot.

Share:
108,405

Related videos on Youtube

JoeSteiger
Author by

JoeSteiger

Joe is the author of the open source blog JoeSteiger.com, where he presents tutorials on the Ubuntu Linux operating system and other open source software. He also writes news and reviews of the latest technology devices. Joe has a passion for all types oftechnology, is an avid Baltimore Ravens fan, and supporter of the MDA. He can be reached at [email protected].

Updated on September 18, 2022

Comments

  • JoeSteiger
    JoeSteiger over 1 year

    I have a MKV video I want to convert to MP4, but every which way I try and convert it (Handbrake, WinFF, FFmpeg, MEncoder,...) I lose the video's subtitles. How can I convert the video, keeping the subtitles, or add a subtitles .srt?

    I also would like 2-pass encoding with a video bitrate 4054 and audio bitrate 160.

    Thanks.

    I was asked for the ffmpeg -i:

    joe@joe-Leopard-Extreme:/media/Elements/Home Folder/Videos$ ffmpeg -i iron.mkv
    ffmpeg version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav     developers
    built on Jun 12 2012 16:52:09 with gcc 4.6.3
    *** THIS PROGRAM IS DEPRECATED ***
    This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
    [matroska,webm @ 0x1a319a0] Estimating duration from bitrate, this may be inaccurate
    Input #0, matroska,webm, from 'iron.mkv':
    Metadata:
    title           : Iron 
    Duration: 02:06:01.67, start: 0.000000, bitrate: 1280 kb/s
    Chapter #0.0: start 0.000000, end 546.170622
    Metadata:
      title           : Chapter 00
    Chapter #0.1: start 546.170622, end 1080.579489
    Metadata:
      title           : Chapter 01
    Chapter #0.2: start 1080.579489, end 1609.941667
    Metadata:
      title           : Chapter 02
    Chapter #0.3: start 1609.941667, end 2101.849733
    Metadata:
      title           : Chapter 03
    Chapter #0.4: start 2101.849733, end 2595.259333
    Metadata:
      title           : Chapter 04
    Chapter #0.5: start 2595.259333, end 3158.488667
    Metadata:
      title           : Chapter 05
    Chapter #0.6: start 3158.488667, end 3564.644400
    Metadata:
      title           : Chapter 06
    Chapter #0.7: start 3564.644400, end 4052.423356
    Metadata:
      title           : Chapter 07
    Chapter #0.8: start 4052.423356, end 4304.300000
    Metadata:
      title           : Chapter 08
    Chapter #0.9: start 4304.300000, end 4711.206489
    Metadata:
      title           : Chapter 09
    Chapter #0.10: start 4711.206489, end 5080.575489
    Metadata:
      title           : Chapter 10
    Chapter #0.11: start 5080.575489, end 5700.111067
    Metadata:
      title           : Chapter 11
    Chapter #0.12: start 5700.111067, end 6269.346400
    Metadata:
      title           : Chapter 12
    Chapter #0.13: start 6269.346400, end 6811.471333
    Metadata:
      title           : Chapter 13
    Chapter #0.14: start 6811.471333, end 7561.679000
    Metadata:
      title           : Chapter 14
    Stream #0.0(eng): Video: h264 (High), yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc
    Stream #0.1(eng): Audio: ac3, 48000 Hz, 5.1, s16, 640 kb/s (default)
    Metadata:
      title           : 3/2+1
    Stream #0.2(ita): Audio: ac3, 48000 Hz, 5.1, s16, 640 kb/s
    Metadata:
      title           : 3/2+1
    Stream #0.3(eng): Subtitle: pgssub (default)
    Stream #0.4(eng): Subtitle: pgssub
    Stream #0.5(eng): Subtitle: pgssub
    Stream #0.6(eng): Subtitle: pgssub
    At least one output file must be specified
    joe@joe-Leopard-Extreme:/media/Elements/Home Folder/Videos
    
  • semtex41
    semtex41 about 6 years
    Here is an example that worked to copy the subtitle stream: ffmpeg -i "C:\mypath\example.mp4" -vcodec copy -ac 2 -af "volume=15dB" -scodec copy "C:\mypath\example.newcopy.mp4" Note: the -ac 2 switch is used to convert mono to stereo. The -af "volume=15dB" switch boosts the gain.
  • manit
    manit over 2 years
    working example: ffmpeg.exe -i infile.mkv -map 0 -vcodec copy -acodec aac -scodec copy outfile.mkv