¿Cómo quitar secuencias de audio de un archivo MKV?

16

He estado tratando de eliminar transmisiones de audio innecesarias de un archivo MKV (Matroska). La razón por la que quiero hacer esto es para evitar tener que seleccionar manualmente la transmisión deseada en Windows Media Player.

El archivo de entrada proporciona la siguiente información de ffmpeg:

Stream #0.0: Video: mpeg4, yuv420p, 704x396 [PAR 1:1 DAR 16:9], 29.98 tbr, 1k tbn, 29.98 tbc
Stream #0.1(eng): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.2(jpn): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.3(eng): Subtitle: 0x0000
Stream #0.4(eng): Subtitle: 0x0000
Stream #0.5: Attachment: 0x0000
Stream #0.6: Attachment: 0x0000

Como quiero las transmisiones 0, 1 y 3 (sub), mi comando ffmpeg se ve así:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:3 -vcodec copy -acodec libmp3lame -newsubtitle test.mkv

que extrañamente da el error:

At least one output file must be specified

Eliminar los subtítulos:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -vcodec copy -acodec libmp3lame test.mkv

me da esto:

Number of stream maps must match number of output streams

Parece que realmente no entiendo cómo funciona la opción "mapa". ¿Alguien me ayudaría a resolverlo?

Apilado
fuente

Respuestas:

25

Si todo lo que desea hacer es eliminar una secuencia, no volver a codificar, probablemente desee hacerlo con el paquete MKVtoolnix (consulte la página de videohelp.com ).

Hay un par de GUI que pueden ayudarlo (consulte el enlace de ayuda de video). No estoy seguro de cuál mkvmergepodría ser la línea de comandos exacta , pero creo que algo como esto funcionaría:

# first, get audio track info so we know which one to keep
mkvmerge -i input.mkv
File 'input.mkv': container: Matroska
Track ID 1: video (V_MPEG4/ISO/AVC)
Track ID 2: audio (A_AAC)
Track ID 3: audio (A_AAC)        <----------- for example, let's keep this one
Track ID 4: audio (A_AAC)

mkvmerge -o output.mkv --atracks 3 input.mkv

Eso debería ser el truco (no tengo un archivo a mano para probar, lo siento). La --atracksopción le indica mkvmergeque copie solo las pistas de audio enumeradas en el nuevo archivo. Si quisieras mantener 2 y 3 pero no 4, podrías usar --atracks 2,3.

mkvmergetiene muchas otras opciones para configurar títulos, agregar un retraso para sincronizar audio, etc., así que revise la página de manual para más detalles.

quijote curandero
fuente
55
Parece que la --atracksopción ya no existe, en su lugar uno debe usar cualquiera --audio-trackso --video-tracks.
malat
0

Intenta -fforzar el formato especificado:

ffmpeg -i input.mkv -map 0: 0 -map 0: 1 -map 0: 3 -vcodec copy -acodec libmp3lame -newsubtitle -f mkv test.mkv
John T
fuente
Esto extrañamente me da el error: "Se debe especificar al menos un archivo de salida"
StackedCrooked
intente usar una ruta completa, es decir: C: \ ruta \ a \ salida.mkv (supongo que está en Windows por la referencia del reproductor multimedia)
John T
@John T: usar la ruta completa (con o sin comillas) todavía me da el mensaje de error "Se debe especificar al menos un archivo de salida".
StackedCrooked
0

Realmente hay dos problemas separados aquí:

  1. En la primera línea de comando, el orden de los parámetros puede ser incorrecto. Creo que el -newaudiointerruptor debe estar al final, después del nombre del archivo de salida.

  2. La segunda línea de comando, "Eliminar los subtítulos", dado que el archivo de entrada tiene subtítulos, debe usar el -sninterruptor para eliminarlos. De lo contrario, parece que FFmpeg quiere al menos uno especificado en la -maplista.

user57355
fuente
0

En su primer comando, no especificó que test.mkv era su archivo de salida. Parece que necesita cambiar esa parte para que sea algo así como ... -c copy test.mkvespecificar el códec ... -c:s copy test.mkv.

Y no estoy seguro de qué -newsubtitleestá haciendo esa bandera allí. Pero si tiene un archivo de subtítulos que desea agregar, debería poder hacer otra marca de entrada -i input.srt. Vea este enlace para eso.

En su segundo comando, creo que parece que está tratando de mapear la secuencia de video e intentando copiarla. Por lo tanto, puede intentar eliminar la -vcodec copyinstrucción y debería funcionar. :)

Chef Faraón
fuente
1
No hay l especificador de flujo .
llogan