¿Cómo agrego y / o mantengo subtítulos al convertir un video?

16

Tengo un video mkv que quiero convertir a mp4, pero de todas formas trato de convertirlo (Handbrake, WinFF, ffmpeg, mencoder, ... pierdo los subtítulos del video. ¿Cómo puedo convertir el video, manteniendo los subtítulos, o agregar un subtítulos.srt?

También me gustaría una codificación de 2 pasos con una tasa de bits de video de 4054 y una tasa de bits de audio de 160.

Gracias.

Me pidieron el 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
JoeSteiger
fuente

Respuestas:

19

Softsubs

MP4 admite la transmisión de subtítulos en formato de texto, pero la compatibilidad de reproducción para esto entre reproductores y dispositivos no es universal.

Ejemplo básico que usa el comportamiento de selección de transmisión predeterminado mientras se copia la transmisión del audio:

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

Ejemplo para copiar todas las transmisiones de audio y video, convertir todas las transmisiones de entrada de subtítulos basadas en texto (SRT, ASS, VTT, etc.) al formato de transmisión de texto y configurar el idioma para las dos primeras transmisiones de subtítulos.

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

Igual que el anterior pero vuelve a codificar el video y el audio en formatos compatibles con el contenedor MP4 (video H.264:

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

Igual que el anterior, pero use la -mapopción para elegir la primera transmisión de video, la segunda transmisión de audio y la tercera transmisión de subtítulos:

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

Entradas de formato de subtítulos basadas en texto

Utilice el filtro de subtítulos para "grabar" los formatos de subtítulos basados ​​en texto (SRT, ASS, VTT, etc.). Tenga en cuenta que esto requiere una nueva codificación, por lo que será mucho más lento que el uso de softsubs.

Ejemplo básico que usa el comportamiento de selección de transmisión predeterminado mientras se copia la transmisión del audio:

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

Ejemplo para usar la tercera secuencia de video, la quinta secuencia de subtítulos y la primera secuencia de audio:

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

Ejemplo para un archivo de entrada de subtítulos separado ( your-subtitles-file.srt):

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

Entradas de formato de subtítulos basadas en imágenes

Usa el filtro de superposición . Este ejemplo superpondrá la cuarta secuencia de subtítulos sobre la segunda secuencia de video, y copiará la séptima secuencia de audio:

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

Ver también

lema
fuente
Esto me ha confundido un poco. ¿Puedes proporcionar el comando completo? Sí, estoy apuntando a un tamaño de archivo de salida específico.
JoeSteiger
@JoeSteiger Debe actualizar su pregunta proporcionando ffmpeg -i input.mkvprimero la salida de la consola .
llogan
¿Es lo anterior lo que quisiste decir?
JoeSteiger
@ JoeSteiger Sí, eso es útil.
llogan
K, déjame saber qué hacer a continuación.
JoeSteiger
13

puede usar -map 0 para asegurarse de que se copien todas las secuencias. Si no es posible con el formato, ffmpeg debería generar un error.

-map 0 le dice a ffmpeg / libav que incluya todas las transmisiones, no solo aquellas para las que definió las reglas de convección.

Normalmente -map se utiliza para definir la asignación de flujo, es decir, el flujo 1 en la entrada debe convertirse en el flujo 0 en la salida. Con solo -map 0 le dices a ffmpeg / libav que tome todas las transmisiones sin barajar.

Arne Babenhauserheide
fuente
¿Puedes explicar un poco más?
Kaz Wolfe
Edité mi respuesta
Arne Babenhauserheide el
1

Si solo desea hacer una conversión simple a mp4, puede usar VLC. VLC aceptará un archivo de subtítulos y lo representará en la salida.

Para conversiones más complicadas, incluido el diseño de los subtítulos, puede usar OpenShot.

usuario191688
fuente
-1

Bueno, encontré una manera de hacerlo funcionar, no ideal, pero funciona. Puedo agregar un srt a un video con mkvmerge. La única desventaja es que hace que el video sea mkv, no mp4.

JoeSteiger
fuente