Use ffmpeg para agregar subtítulos de texto [cerrado]

122

Estoy tratando de agregar subtítulos de texto a un contenedor .mp4 usando ffmpeg:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mp4

Cuando intento ejecutar esta línea, me da un error:

El número de mapas de flujo debe coincidir con el número de flujos de salida.

Si trato de cambiar el mp4 a mkv (aunque mp4 admite subtítulos de texto), así:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mkv

Mapea correctamente las transmisiones, pero da un error:

Codificador (codec id 94210) no encontrado para el flujo de salida # 0.2

Cuando lance

ffmpeg -codecs

Puedo ver que el códec srt es compatible como decodificador y codificador, sin embargo, no estoy seguro de qué se usa para la codificación de subsistemas mp4 y mkv, y si necesito encenderlo o compilarlo por separado.

0-alfa
fuente

Respuestas:

196
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4

-vf subtitles=infile.srt no funcionará con -c copy


El orden de -c copy -c:s mov_textes importante. Le estás diciendo a FFmpeg:

  1. Video: copia, Audio: copia, Subtítulo: copia
  2. Subtítulo: mov_text

Si los inviertes, le estás diciendo a FFmpeg:

  1. Subtítulo: mov_text
  2. Video: copia, Audio: copia, Subtítulo: copia

Alternativamente, puede usar -c:v copy -c:a copy -c:s mov_texten cualquier orden.

Steven Penny
fuente
13
Este método agrega subtítulos al archivo como uno de transmisión, por lo que necesita soporte del reproductor para mostrar los subtítulos (como VLC)
BollMose
1
¿Esto significa que el subtítulo está disponible, pero no grabado en el video? ¿Puedo mostrar si quiero a pedido?
Dom
3
Sí @ sunk818, eso es lo que esto significa. Esto agrega el subtítulo como una pista que se puede habilitar o deshabilitar siempre que el reproductor lo admita. Mr. Hyde y Paul ffmpeg también pueden agregar los subtítulos en la parte superior del video, y en esos casos controlaría cosas como la fuente y el posicionamiento.
Boushley
1
Los archivos .srt deben importarse con -c:s copyno con -c:s mov_text.
GetFree
82

NOTA: Esta solución "graba los subtítulos" en el video, de modo que todos los espectadores del video se verán obligados a verlos.

Use la libassbiblioteca (asegúrese de que su instalación de ffmpeg tenga la biblioteca en la configuración --enable-libass).

Primero convierta los subtítulos a .assformato:

ffmpeg -i subtitles.srt subtitles.ass

Luego agréguelos usando un filtro de video:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4
HdN8
fuente
40
Esto los "quemará" en el video, lo que significa que no puede desactivarlos en el reproductor. Esto es diferente a agregarlos como una secuencia de subtítulos que el jugador puede leer y mostrar si el espectador los quiere.
stib
1
Muchas gracias por esta solución. ¿Hay alguna forma de especificar el tamaño de los personajes?
user1319182
1
Eche un vistazo a esta respuesta: stackoverflow.com/questions/21363334/… . Probablemente desee establecer la fuente en el archivo de subtítulos en sí mismo; de lo contrario, utilizando el filtro de subtítulos, puede forzar_style para configurar la Fuente: ffmpeg.org/ffmpeg-filters.html#subtitles-1
HdN8
Esto será útil al agregar subtítulos para videos en algún lugar como Instagram. En algún lugar como el espectador de Instagram, el usuario no tiene la capacidad de escuchar el sonido o el video está en otro idioma, entonces el usuario puede leer el subtítulo en su lugar
ϻαϻɾΣɀО-MaMrEzO
1
Instale libassextensiones si faltan en los sistemas Debian con 'apt update && apt install libass-dev ".
Sopalajo de Arrierez
53

Estás intentando mux subtítulos como una secuencia de subtítulos. Es fácil pero se usa una sintaxis diferente para MP4 (o M4V) y MKV. En ambos casos, debe especificar el códec de audio y video, o simplemente copiar la transmisión si solo desea agregar subtítulos.

MP4:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s mov_text output.mp4

MKV:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s srt  output.mkv
dotokija
fuente
3
¿Es posible agregar más de un subtítulo? ¿Se reconocerá este softsub como idioma desconocido?
Patrick
1
Sí lo es. Lo acabo de probar para MKV:
dotokija
77
Primero agregue otra entrada: -i input2.srt. En segundo lugar, asigne eso como segunda secuencia: -map 2: 0. Finalmente, seleccione el codificador para el segundo flujo de subtítulos (el mismo que el primero): -c: s srt. El ejemplo completo \ ffmpeg -i input.mp4 -f srt -i input.srt -i input2.srt \ -map 0: 0 -map 0: 1 -map 1: 0 -map 2: 0 -c: v copy - c: una copia \ -c: s srt -c: s srt output.mkv
dotokija
8
Y para agregar metadatos de idioma (insertar antes del archivo de salida) "-metadata: s: s: 0 language = eng"
Patrick
¿por qué los subtítulos en el archivo original se excluyen cuando "reenvío" archivos mkv como archivos mp4 (ffmpeg -i film.mkv -vcodec copy -acodec copy film.mp4)? el mkv original tiene subtítulos pero la salida en formato mp4 no. ¿que esta pasando? ¿Qué no estoy haciendo correctamente?
oldboy
9

El contenedor MKV admite códecs de audio y video Prácticamente cualquier cosa y también admite subtítulos y menús de DVD. Por lo tanto, puede copiar códecs del video de entrada al video de salida con el contenedor MKV con subtítulos. Primero debes convertir SRT al formato de subtítulos ASS

ffmpeg -i input.srt input.ass

e incrustar subtítulos ASS en video

ffmpeg -i input.mp4 -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

También trabajó con el archivo VMW.

ffmpeg -i input.wmv -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

ver la página wiki Comparación de formatos de contenedor

kan
fuente
1
HV no es realmente relevante, siempre es bienvenido ver más soluciones que una.
JasonXA
8

ffmpeg admite el mov_textcodificador de subtítulos, que es casi el único compatible con un contenedor MP4 y se puede reproducir en iTunes, Quicktime, iOS, etc.

Tu línea leería:

ffmpeg -i input.mp4 -i input.srt -map 0:0 -map 0:1 -map 1:0 -c:s mov_text output.mp4

Mirko Klemm
fuente
5

Intenté usar MP4Box para esta tarea, pero no podía manejar el M4V con el que estaba tratando. Tuve éxito al incrustar el SRT como subtítulos suaves con ffmpeg con la siguiente línea de comando:

ffmpeg -i input.m4v -i input.srt -vcodec copy -acodec copy -scodec copy -map 0:0 -map 0:1 -map 1:0 -y output.mkv

Como usted, tuve que usar un archivo de salida MKV; no pude crear un archivo M4V.

D Coetzee
fuente
3

Proporcionaré una respuesta simple y general que funcione con cualquier cantidad de audios y subtítulos srt y respete los metadatos que pueden incluir el contenedor mkv . Por lo tanto, incluso agregará las imágenes que el matroska puede incluir como archivos adjuntos (aunque no otros tipos AFAIK) y las convertirá en pistas; no podrá verlos, pero estarán allí (puede quitarlos). Ah, y si el mkv también tiene capítulos, el mp4 también.

ffmpeg -i <mkv-input> -c copy -map 0 -c:s mov_text <mp4-output>

Como puede ver, se trata de lo -map 0que le dice a FFmpeg que agregue todas las pistas, lo que incluye metadatos, capítulos, archivos adjuntos, etc. Si hay una "pista" no reconocida ( mkv permite adjuntar cualquier tipo de archivo), terminar con un error

Puede crear un lote simple mkv2mp4.bat, si generalmente hace esto, para crear un mp4 con el mismo nombre que el mkv . Sería mejor con control de errores, un nombre de salida diferente, etc., pero entiendes el punto.

@ffmpeg -i %1 -c copy -map 0 -c:s mov_text "%~n1.mp4"

Ahora puedes simplemente correr

mkv2mp4 "Video with subtitles etc.mkv"

Y creará "Video con subtítulos, etc.mp4" con el máximo de información incluida.

cdlvcdlv
fuente
-1

Ejemplo simple:

videoSource=test.mp4
videoEncoded=test2.mp4
videoSubtitle=test.srt
videoFontSize=24
ffmpeg -i "$videoSource" -vf subtitles="$videoSubtitle":force_style='Fontsize="$videoFontSize"' "$videoEncoded"

Solo reemplace las variables de Linux

Daniel Gianni
fuente
¿Cuidado para elaborar?
RamenChef
-3

Esta es la razón por la cual mkv es un buen contenedor, especialmente ahora que está maduro:

mkvmerge -o output.mkv video.mp4 subtitle.srt
Corley Kinnane
fuente
3
¿Le gustaría comentar por qué su enfoque solucionaría el problema del OP?
mjuarez