How to extract subtitle from video using ffmpeg?
I am trying to extract subtitle from video as .srt file, I used the following command:
FFMPEG -i mytestmovie.mkv -vn -an -codec:s:0.1 srt sub.srtBut, I got an error as Unrecognized option codec:s:0:1
So, can you tell me the exact command and how to extract a subtitle as .srt file in video?
4 Answers
Simple:
ffmpeg -i Movie.mkv -map 0:s:0 subs.srt- -i: Input file URL/path.
- -map: Designate one or more input streams as a source for the output file.
- s:0: Select the subtitle stream.
-codec:s:0:1 is incorrect. If you use -codec:s:0 then ffmpeg will use the stated codec for the first subtitle stream being passed to the output, if you use -codec:s:1 then it will use it for the second subtitle stream, etc.
You can also use -codec:s to select all output subtitle streams, or -codec:2 to select the third output stream, regardless of what it is.
You are probably confused because the -map option behaves in a different way - there, you have to select which input the selected stream comes from. (so, -map 0:s:0 would take the first subtitle stream from the first input, and feed it to the output). However, -map is for selecting which streams you want to take from the inputs; whereas most of the other options that use stream mapping are for use on the streams after they have been selected (so there's no need to specify which input file they're from), as they are passed to the output.
ffmpeg -i video.mkv subs.srtWicked, right?
Worked for me just now, for a bunch of MKVs containing a single SRT stream. Apparently this is the default behavior. My ffmpeg version is 20170516, from ubuntu 16.4
updated the code to v6 ver.
work pretty good.
usage:
ffmpegSubExtract Mp4 Srt
ffmpegSubExtract mkv Srt 1
@echo off
cls
title ffmpegSubExtract TOOL
if "%1"=="" (
echo.
echo Usage:
echo ffmpegSubsubExtract mp4 srt
echo ffmpegSubsubExtract mp4 srt 1
goto :eof )
if "%2"=="" (
echo.
echo Usage:
echo ffmpegSubsubExtract mp4 srt
echo ffmpegSubsubExtract mp4 srt 1
goto :eof )
set fleExt=%1
set subExt=%2
set stream=%3
for %%i in ("*.%fleExt%") do ( set fname=%%i call :process )
goto :eof
:process
if exist "%fname:~0,-4%.%subExt%" ( del "%fname:~0,-4%.%subExt%" )
if "%stream%"=="" ( set stream=0 )
if "%subExt%" == "srt" ( title ffmpegSubExtract TOOL ~ SubRip mode ffmpeg -i "%fname%" -map 0:s:%stream% "%fname:~0,-4%.%subExt%"
) else ( title ffmpegSubExtract TOOL ~ "%subExt%" mode ffmpeg -i "%fname%" -c copy -map 0:s:%stream% "%fname:~0,-4%.%subExt%"
)
goto :eof