
No estoy muy versado en FFmpeg, y he intentado hacer esto muchas veces yo mismo, pero ni siquiera pude entender la sintaxis. Así que voy a preguntarle a personas mucho más inteligentes que yo. Deseo usar FFmpeg para eliminar todas las opciones que no estén en inglés y luego eliminarlas.
Después de eso, eliminando todas las opciones en inglés excepto la primera indexada. No pude resolver eso sin importar lo que intenté, y me golpeé la cabeza contra la pared durante aproximadamente 3 horas intentándolo, siendo mi último intento:
ffmpeg -i "Episode 01 - Yaha-kui zaShunina.mkv" -map 0:v -map 0:s -map 0:m:language:eng -map:0:a:1? -codec copy "copy Episode 01 - Yaha-kui zaShunina.mkv"
Este fue el único para el que obtuve la sintaxis correcta... y todavía no funcionó del todo. ¿Alguien más inteligente que yo capaz de ayudar? Además, preferiría conservar todos los videos y asegurarme de que sean subtítulos suaves en lugar de grabados.
Respuesta1
La sintaxis es -map 0:s:m:language:eng
:
ffmpeg -y -i "Episode 01 - Yaha-kui zaShunina.mkv" -map 0:v -map 0:a? -map 0:s:m:language:eng -codec copy "copy Episode 01 - Yaha-kui zaShunina.mkv"
El problema es que está mapeando todos los subtítulos en inglés (no solo la primera transmisión). Podemos ejecutar FFmpeg por segunda vez para mantener solo la primera transmisión de subtítulos en inglés usando -map 0:s:0
:
ffmpeg -y -i "Episode 01 - Yaha-kui zaShunina.mkv" -map 0:v -map 0:a? -map 0:s:0 -codec copy "copy copy Episode 01 - Yaha-kui zaShunina.mkv"
(No sé si es posible mantener solo la primera transmisión en inglés en un comando).
La siguientecorreo, muestra que para mapear una transmisión de audio en inglés la sintaxis es -map 0:a:m:language:eng
.
0:a
se refiere al flujo de audio.
Podemos reemplazarlo 0:s
para referir la transmisión de subtítulos.
Pruebas:
Cree un archivo de video sintético con múltiples transmisiones de video, audio y subtítulos (para probar):
ffmpeg -y -f lavfi -i testsrc=size=384x206:rate=1 -f lavfi -i sine=frequency=300 -f lavfi -i sine=frequency=400 -f lavfi -i sine=frequency=500 -i in.srt -i in.srt -i in.srt -i in.srt -i in.srt -map:v 0 -map:a 1 -map:a 2 -map:a 3 -map:s 4 -map:s 5 -map:s 6 -map:s 7 -map:s 8 -c:v libx264 -c:a:0 ac3 -ar:0 44100 -c:a:1 ac3 -ar:1 44100 -strict -2 -c:a:2 dca -ar:2 44100 -c:s ass -metadata:s:a:0 language=fra -metadata:s:a:1 language=ger -metadata:s:a:2 language=eng -metadata:s:s:0 language=fra -metadata:s:s:1 language=ger -metadata:s:s:2 language=ger -metadata:s:s:3 language=ger -metadata:s:s:4 language=eng -t 10 input.mkv
Contenido de in.srt
(usado para pruebas):
1
00:00:00,0 --> 00:00:01,0
Sec 0 to 1
2
00:00:01,0 --> 00:00:02,0
Sec 1 to 2
3
00:00:02,0 --> 00:00:03,0
Sec 2 to 3
4
00:00:03,0 --> 00:00:04,0
Sec 3 to 4
Comprobación de las transmisiones del input.mkv
uso de la herramienta MediaInfo:
Video
ID : 1
Format : AVC
...
Audio #1
ID : 2
Language : French
...
Audio #2
ID : 3
Language : German
...
Audio #3
ID : 4
Language : English
...
Text #1
ID : 5
Language : French
...
Text #2
ID : 6
Language : German
...
Text #3
Language : English
...
Text #4
Language : German
...
Text #5
ID : 9
Language : English
Ejecutando el comando para mantener solo los subtítulos en inglés:
ffmpeg -y -i input.mkv -map 0:v -map 0:a? -map 0:s:m:language:eng -codec copy tmp_output.mkv
Usando MediaInfo tmp_output.mkv
podemos ver que hay dos subtítulos en inglés.
Ejecute FFmpeg una vez más con -map 0:s:0
:
ffmpeg -y -i tmp_output.mkv -map 0:v -map 0:a? -map 0:s:0 -codec copy output.mkv
Verificar las transmisiones de output.mkv usando la herramienta MediaInfo muestra solo una transmisión de subtítulos en inglés:
Text
ID : 5
Language : English
Default : Yes
Forced : No