este problema se puede tratar de diversas formas, pero en este caso te enseñamos la respuesta más completa en nuestra opinión.
Solución:
Todavía no hay opción en ffmpeg
para extraer automáticamente todos los flujos en un contenedor apropiado, pero ciertamente es posible hacerlo manualmente.
Solo necesita conocer los contenedores adecuados para los formatos que desea extraer.
La selección de transmisión predeterminada solo elige una transmisión por tipo de transmisión, por lo que debe asignar manualmente cada transmisión con el -map
opción.
1. Obtener información de entrada
Utilizando ffmpeg
o ffprobe
puede obtener la información en cada flujo individual, y hay una amplia variedad de formatos (xml, json, cvs, etc.) disponibles para satisfacer sus necesidades.
ffmpeg
ejemplo
ffmpeg -i input.mkv
La salida resultante (corté algunas cosas adicionales, los números de transmisión y la información de formato son lo que es importante):
Input #0, matroska,webm, from 'input.mkv':
Metadata:
Duration: 00:00:05.00, start: 0.000000, bitrate: 106 kb/s
Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp (default)
Stream #0:2: Audio: aac, 44100 Hz, mono, fltp (default)
Stream #0:3: Audio: flac, 44100 Hz, mono, fltp (default)
Stream #0:4: Subtitle: ass (default)
ffprobe
ejemplo
ffprobe -v error -show_entries stream=index,codec_name,codec_type input.mkv
La salida resultante:
[STREAM]
index=0
codec_name=h264
codec_type=video
[/STREAM]
[STREAM]
index=1
codec_name=vorbis
codec_type=audio
[/STREAM]
[STREAM]
index=2
codec_name=aac
codec_type=audio
[/STREAM]
[STREAM]
index=3
codec_name=flac
codec_type=audio
[/STREAM]
[STREAM]
index=4
codec_name=ass
codec_type=subtitle
[/STREAM]
2. Extrae las corrientes
Usando la información de uno de los comandos anteriores:
ffmpeg -i input.mkv
-map 0:v -c copy video_h264.mkv
-map 0:a:0 -c copy audio0_vorbis.oga
-map 0:a:1 -c copy audio1_aac.m4a
-map 0:a:2 -c copy audio2.flac
-map 0:s -c copy subtitles.ass
En este caso, el ejemplo anterior es el mismo que:
ffmpeg -i input.mkv
-map 0:0 -c copy video_h264.mkv
-map 0:1 -c copy audio0_vorbis.oga
-map 0:2 -c copy audio1_aac.m4a
-map 0:3 -c copy audio2.flac
-map 0:4 -c copy subtitles.ass
-
Prefiero el primer ejemplo porque el
input file index:stream specifier:stream index
es más flexible y eficiente; también es menos propenso a mapeos incorrectos. -
Consulte la documentación sobre especificadores de flujo y
-map
opción para comprender completamente la sintaxis. La información adicional está en la respuesta al video y audio de FFmpeg mux (de otro video): problema de mapeo. -
Estos ejemplos transmitirán copia (re-mux) por lo que no ocurrirá una recodificación.
Formatos de contenedor
Una lista parcial para hacer coincidir la transmisión con la extensión de salida para algunos formatos comunes:
Video Format Compatible extension(s)
H.264 .mp4, .m4v, .h264, .264
H.265/HEVC .mp4, .h265, .265
VP8/VP9 .webm
AV1 .mp4
MPEG-4 .mp4, .avi
MPEG-2 .mpg, .vob, .ts
DV .dv, .avi
Theora .ogv/.ogg
FFV1 .mkv
Almost anything .mkv, .nut
Audio Format Compatible extension(s)
AAC .m4a, .aac
MP3 .mp3
PCM .wav
vorbis .oga/.ogg
opus .opus, .oga/.ogg, .mp4
flac .flac, .oga/.ogg
Almost anything .mka, .nut
Subtitle Format Compatible extension(s)
Subrip/SRT .srt
SubStation Alpha/ASS .ass
Primero enumeraría todas las transmisiones de audio:
ffmpeg -i VIDEO.mkv
y luego, según la salida, puede compilar el comando para extraer las pistas de audio individualmente.
Usando algún script de shell, puede potencialmente automatizar esto en un archivo de script para que pueda hacerlo de forma genérica para cualquier archivo mkv.
Los subtítulos son prácticamente iguales. Los subtítulos se imprimirán en la información y luego podrás extraerlos, similar a:
ffmpeg -threads 4 -i VIDEO.mkv -vn -an -codec:s:0.2 srt myLangSubtitle.srt
0.2 es el identificador que debe leer de la información.
Sección de Reseñas y Valoraciones
Si te sientes impulsado, eres capaz de dejar una división acerca de qué te ha gustado de este tutorial.