91 votes

Comment extraire les sous-titres d'une vidéo en utilisant ffmpeg ?

J'essaie d'extraire les sous-titres d'une vidéo en tant que .srt j'ai utilisé la commande suivante :

FFMPEG -i mytestmovie.mkv -vn -an -codec:s:0.1 srt sub.srt

Mais, j'ai reçu une erreur comme option non reconnue. codec:s:0:1 Donc, pouvez-vous me dire la commande exacte et comment extraire un sous-titre en tant que .srt dans la vidéo ?

160voto

User Points 33

Simple :

ffmpeg -i Movie.mkv -map 0:s:0 subs.srt
  • -i : URL/chemin du fichier d'entrée.
  • -map : Désigner un ou plusieurs flux d'entrée comme source pour le fichier de sortie.
  • s:0 : Sélectionnez le flux de sous-titres.

15voto

Berry Tsakala Points 1245
ffmpeg -i video.mkv subs.srt

Mauvais, pas vrai ?

Cela a fonctionné pour moi à l'instant, pour un groupe de MKVs contenant un seul flux SRT. Apparemment, c'est le comportement par défaut. Ma version de ffmpeg est 20170516, depuis ubuntu 16.4

13voto

evilsoup Points 12077

-codec:s:0:1 est incorrecte. Si vous utilisez -codec:s:0 alors ffmpeg utilisera le codec indiqué pour le premier flux de sous-titres transmis à la sortie, si vous utilisez la fonction -codec:s:1 puis il l'utilisera pour le deuxième flux de sous-titres, etc.

Vous pouvez également utiliser -codec:s pour sélectionner todos flux de sous-titres en sortie, ou -codec:2 pour sélectionner le troisième flux de sortie, quel qu'il soit.

Vous êtes probablement confus parce que le -map se comporte d'une manière différente - là, vous devez choisir de quelle entrée provient le flux sélectionné. (donc, -map 0:s:0 prendrait le premier flux de sous-titres de la première entrée, et le transmettrait à la sortie). Cependant, -map sert à sélectionner les flux que vous voulez prendre dans les entrées ; alors que la plupart des autres options qui utilisent le mappage de flux sont à utiliser sur les flux après qu'ils aient été sélectionnés (il n'y a donc pas besoin de spécifier de quel fichier d'entrée ils proviennent), lorsqu'ils sont passés à la sortie.

-1voto

Maor Parizat Points 1

J'ai mis à jour le code à la version 6.

fonctionnent plutôt bien.

l'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

-2voto

Garric Points 97

Fichier batch. Copiez ce code dans le nouveau fichier .bat.

Il suffit d'y déposer un fichier .mkv pour obtenir un fichier de sous-titres .srt.

Entre autres choses, j'ai fait un appel asynchrone de msgBox. Qui en a besoin - copiez-le dans vos sources.

Pour une raison quelconque, il n'accepte pas les parenthèses () dans les noms de fichiers. Je n'ai pas vérifié le reste des caractères.

    @echo off
    :: Your language code
    :: chcp 866 
    if "%~x1"==".mkv" (
        set mkv=%~n1
        set path=%~d1%~p1
    )
    if "%~x2"==".mkv" (
        set mkv=%~n2
        set path=%~d1%~p1
    )
    if not "%mkv%"=="" (
            :: If your original ffmpeg.exe file located in system32 directory then replace "%~dp0ffmpeg.exe" to ffmpeg
            "%~dp0ffmpeg.exe" -i "%path%%mkv%.mkv" -map 0:s:0 "%path%%mkv%.srt"
            call :msgbox "File %path%%mkv%.srt completed."
    ) else call :msgbox "File .mkv missing in the input parameters`r`nJust drop file with extensions:`r`n.mkv to this batch file to get subtitle file .srt"
    goto :eof

    :msgBox [msgText]
    C:\Windows\System32\mshta.exe vbscript:Execute("CreateObject(""WScript.Shell"").Run ""powershell -Command """"[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')|Out-Null;"""" """"[System.Windows.Forms.MessageBox]::Show(\""""%~1\"""")"""""",0,false:close")
    exit /B

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X