Tener problemas para entender el comando ffmpeg -map

Tener problemas para entender el comando ffmpeg -map

Estoy intentando copiar video/audio desde un contenedor mkv a mp4. Cuando ejecuto ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4no me aparece ningún vídeo con audio polaco. Sólo hay una transmisión de video, la transmisión #0:0. La transmisión #0:1 es audio polaco, #0:2 en inglés y #0:3 - #0:5 son subtítulos.

Yo leoWiki FFmpeg: Mapapero no lo entiendo realmente. ¿Por qué está -map 0:1escrito dos veces en el ejemplo 1? ¿Que es lo que -c:shace? ¿Cómo sería un comando para copiar #0:0 a video y #0:2 a audio?

Respuesta1

-map <inputNo>:<streamNo>le dice a ffmpeg que tome la transmisióncorrienteNodesde la entradaentradaNoy agregarlo a la salida, donde <inputNo>comienza con 0.

A veces, es posible que desees tomar el mismo flujo de entrada dos veces (como -map 0:1 -map 0:1en el ejemplo) porque puedes codificar cada uno con diferentes códecs/parámetros. En el ejemplo, la salida contiene la misma secuencia de audio dos veces, una en MP3 y la otra en AAC.

De forma predeterminada (es decir, sin ningún -mapcomando), se toman un video, un audio y una secuencia de subtítulos de las entradas. Si desea mapear todas las transmisiones desde una entrada, use -map <inputNo>.

Que no obtengas vídeo con tu comando sólo puede significar una cosa: tu pista de vídeo está codificada con un códec que se puede mezclar en MKV, pero no en MP4. Por lo que se descarta automáticamente. ¿Puedes publicar un registro ffmpeg -i input.mkvpara que podamos comprobar con qué códecs están codificadas las pistas?

Finalmente, -c:sse utiliza para el códec de subtítulos (mientras que -c:apara audio y -c:vvídeo)

Respuesta2

Este fue el ejemplo que me permitió entender. Imagine el siguiente comando:

ffmpeg -i tears_of_steel.mkv -map 0:0 -map 0:2 -map 0:1 -map 0:4 -map 0:3 -c copy tears_of_steel-v2.mkv 

Y así es como ffmpeg realiza el mapeo:

Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:2 -> #0:1 (copy)
Stream #0:1 -> #0:2 (copy)
Stream #0:4 -> #0:3 (copy)
Stream #0:3 -> #0:4 (copy)

¿Qué pasó?

En el comando, solo tenemos una entrada: Tears_of_steel.mkv. Por eso todos nuestros mapas comienzan con #0:...

Luego escribimos una primera opción de mapa: -map 0:0, que se refiere a la primera secuencia de nuestra entrada (tears_of_steel.mkv), que podría ser una secuencia de vídeo, pero eso no importa.

Debido a que es la primera opción de mapa, se asignará a la primera secuencia en nuestro archivo de salida (tears_of_steel-v2.mkv).

Luego escribimos una segunda opción de mapa: -map 0:2, que se refiere al tercer flujo de nuestra entrada. Debido a que es la segunda opción de mapa, se asigna a la segunda secuencia en nuestra salida.

Etcétera...

Escribí eso en mi github:https://github.com/lingtalfi/ffmpeg-notes/blob/master/ffmpeg-map.md

Respuesta3

Así es como funcionan las opciones -c(seleccionar códecs) y -map(seleccionar transmisiones):

-c:a -> select first or best supported audio (transcoded)
-c:a copy -> best supported audio (copied)
-map 0:a -> all audio from 1st input file (transcoded)
-map 1:a:0 -> 1st audio stream from 2nd input file (transcoded)
-map 1:a:1 -c:a copy -> 2nd audio stream from 2nd input file (copied)

Para copiar todas las transmisiones de subtítulos desde el primer archivo de entrada sin transcodificar:

-map 0:s -c:s copy 

Su archivo de salida es mp4 y su archivo de entrada es mkv y ha elegido tener salida de video sin transcodificar ( -c:v copy) a un formato compatible para mp4, por lo que termina con un archivo mp4 sin video (reproducible).

Especifique un codificador de vídeo compatible con mp4, por ejemplo. -c:v libx264en lugar de -c:v copyo déjelo en blanco (es decir, no mencione un codificador y ffmpegLos codificadores elegidos serán los predeterminados registrados por cada formato de salida.)

Si no desea transcodificar el video (porque puede llevar un tiempo considerable), copie la transmisión del video en el mismo contenedor pero seleccione el audio que desee, por ejemplo. mkv. Para obtener un archivo mp4 con video transcodificado y audio seleccionado:

ffmpeg -i input.mkv -map 0:0 -c:v libx264 -map 0:2 -c:a copy output.mp4

Respuesta4

Esta es una respuesta sencilla para personas como yo, a quienes les gustan las explicaciones prácticas sencillas. Esta es una solución cuando copias mkv a mp4 y quiereselegir transmisiones de audio:

Tu tienes que escribir-mapa 0:númerodecorrientemenosunodelante de -c: una copia

Digamos que el video tiene 3 transmisiones (puedes verlo en mediainfo). La primera transmisión es video, la segunda es audio predeterminado y la tercera es audio no predeterminado en el idioma que desee. Entonces tienes que escribir -map 0:2 NO -map 0:3

Además hay que escribir-map 0:0 delante de -c:v copiarporque si no lo haces, ffmpeg no copiará la transmisión de video y solo obtendrás la transmisión de audio (si el video tiene dos transmisiones de video y quieres copiar la segunda, debes escribir -map 0:1)

Entonces ellínea de comando finalSe ve como esto:

ffmpeg -i "inputpath\input.mkv" -map 0:0 -c:v copy -map 0:2 -c:a copy "outputpath\output.mp4"

En este caso, obtendrás la primera transmisión de video y la tercera transmisión de audio.

Otro ejemplo:

ffmpeg -i "inputpath\input.mkv" -map 0:1 -c:v copy -map 0:6 -c:a copy "outputpath\output.mp4"

En este caso deberías obtener la segunda transmisión de video y la séptima transmisión de audio.

espero que esto ayude

información relacionada