How do I add and/or keep subtitles when converting video?
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.
Related videos on Youtube
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, 2022Comments
-
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 about 6 yearsHere 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 over 2 yearsworking example: ffmpeg.exe -i infile.mkv -map 0 -vcodec copy -acodec aac -scodec copy outfile.mkv