2011-12-29 41 views
60

estoy tratando de añadir subtítulos de texto a un contenedor .mp4 usando ffmpeg:uso ffmpeg para añadir texto subtítulos

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

Cuando estoy tratando de 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 soporta subtítulos de texto), así:

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

Al trazar correctamente las corrientes, pero da un error:

Encóder (id. De códec 94210) no encontrado para la secuencia de salida # 0.2

Cuando lance

ffmpeg -codecs 

Veo que códec SRT se admite como descodificador y codificador, sin embargo no estoy seguro de lo que se utiliza para MP4 y MKV submarinos codificación, y si tengo que encenderlo o compilar por separado.

Respuesta

27

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

Primera convertir los subtítulos a .ass formato:

ffmpeg -i subtitles.srt subtitles.ass 

después añadirlas usando un filtro de vídeo:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4 
+0

que funciona para mí, gracias. –

+17

Esto los "quemará" en el video, lo que significa que no puede apagarlos 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

+0

Muchas gracias por esta solución. ¿Hay alguna forma de especificar el tamaño de los personajes? – user1319182

3

He intentado utilizar MP4Box para esta tarea, pero no podía manejar el M4V Estaba lidiando con. Tuve éxito la incorporación de la SRT subtítulos como suaves con ffmpeg con la siguiente línea de comandos:

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

Al igual que tuve que usar un archivo de salida MKV - yo no era capaz de crear un archivo M4V.

97
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_text es importante.Usted está diciendo FFmpeg:

  1. vídeo: copiar, Audio: copiar, Subtítulo: copiar
  2. Subtítulo: mov_text

Si revertirlas, le está diciendo FFmpeg:

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

Como alternativa, puede utilizar -c:v copy -c:a copy -c:s mov_text en cualquier orden .

+0

¿Dónde está la posición? ? ¡¿parte superior?! ¡¿fondo?! ¡¿centrar?! –

+4

Este método agrega los subtítulos al archivo como uno de transmisión, por lo que necesita compatibilidad con el reproductor para mostrar los subtítulos (como VLC) – BollMose

+0

¿Significa esto que los subtítulos están disponibles, pero no grabados en el video? Puedo mostrar si quiero a pedido? – Sun

5

ffmpeg es compatible con el codificador de subtítulos mov_text que es casi el único apoyado en un contenedor MP4 y reproducible por iTunes, Quicktime, etc. iOS

Su línea sería el siguiente:

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

4

MKV el contenedor admite códecs de audio y video. Prácticamente cualquier cosa y también admite subtítulos y menús de DVD. De modo que puede copiar códecs de video de entrada a video de salida con contenedor MKV con subtítulos. En primer lugar debe convertir a formato de subtítulos SRT CULO

ffmpeg -i input.srt input.ass 

e incrustar subtítulos ASS a vídeo

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 Comparison of container formats

+1

HV no es realmente relevante, siempre es bienvenido ver más soluciones que una. – JasonXA

-3

Ésta es la razón por la cual MKV es un buen contenedor de este tipo, sobre todo ahora que está madura:

mkvmerge -o output.mkv video.mp4 subtitle.srt 
+3

¿Desea comentar por qué su enfoque solucionaría el problema del OP? – mjuarez

28

usted está tratando de mux subtítulos como subtítulo corriente. Es fácil, pero se usa una sintaxis diferente para MP4 (o M4V) y MKV. En ambos casos debe especificar códec de audio y video, o simplemente copiar secuencia 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 
+0

¿Es posible agregar más de un subtítulo? ¿Se reconocerá este softsub como idioma desconocido? – Patrick

+0

Sí, lo es. Acabo de probarlo para MKV: – dotokija

+3

Primero agregue otra entrada: -i input2.srt. Segundo, mapea eso como segunda corriente: -map 2: 0. Finalmente, seleccione el codificador para la segunda secuencia de subtítulos (la misma que la primera): -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

-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" 

reemplazar sólo las variables Linux

+0

¿Cuidar para elaborar? – RamenChef

Cuestiones relacionadas