¿Cómo eliminar una pista de audio de un archivo de video mp4?

Respuestas:

111

Primero ejecute ffmpeg -i file.mp4para ver qué secuencias existen en su archivo. Debería ver algo como esto:

Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0.1: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
Stream #0.2: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s

Luego, ejecute ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4para copiar la transmisión de video y la segunda transmisión de audio new_file.mp4.

gelraen
fuente
3
En Windows, este comando dio el error Option map (set input stream mapping) cannot be applied to input file file.mp4 new_file.mp4 -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.: para solucionarlo, simplemente cambie el orden de los argumentos de esta manera:ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4
MrLore
Mismo error que @MrLore en OS X.
Oskar Persson
1
¡Es lo mismo en Ubuntu!
Tommaso
También funciona para el formato MKV
user3405291
1
Puede utilizar la opción más genérica -c copytener corrientes idénticas para audio, vídeo, sino también los subtítulos: ffmpeg -i input.mp4 -map 0:0 -map 0:2 -c copy output.mp4.
Futal
97

Problema relacionado: la eliminación de todas las pistas de audio de un archivo mp4 se puede hacer así:

ffmpeg -i input_file.mp4 -vcodec copy -an output_file.mp4
Greg Marks
fuente
1
Esto me da el error The encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it.Pero agregué esas banderas y sigue siendo el mismo ...?
poshaughnessy
Ver también: superuser.com/questions/268985/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Comentario de re poshaughnessy: parece que hay información aquí: stackoverflow.com/questions/32931685/… La discusión sugiere que las versiones recientes de ffmpeg no experimentan el problema "aac experimental". Como regla general, es útil diagnosticar su problema si establece la versión del software que está utilizando y la sintaxis exacta del comando (después de agregar las banderas) que dio el error (vea la respuesta de freeseek loc. Cit. ) En este caso específico, la información de video del archivo de entrada también puede ser útil.
Greg Marks
8

Identificar números de transmisión:

$ ffmpeg -i in.mp4
   ...
   Stream #0:0: Video: ...
   Stream #0:1: Audio: ...
   Stream #0:2: Audio: ...

Use -map _file_:_stream_para seleccionar qué flujos procesar y generar

$ ffmpeg -i in.mp4 -map 0:0 -map 0:2 -vcodec copy -acodec copy out.mp4

ver: https://ffmpeg.org/ffmpeg.html#Advanced-options

jgr
fuente
4

Podrías probar avidemuxqué maneja solo un archivo de audio internamente (y por lo tanto te obliga a seleccionar una pista específica). Nunca lo he probado con .mp4 pero funciona con otros formatos.

meneo
fuente
No funciona tan bien Tal vez sea un error, pero el audio regresa destrozado, aunque hace el trabajo (elimina el resto de las pistas de audio).
tshepang
3

Solía Avidemux (GUI) varias veces, y ffmpeg (consola).

En Avidemux, elige "Audio" -> "Seleccionar pistas" en el menú principal; luego guarde su video como un archivo nuevo.

Curiosamente, en algunos casos, Avidemux produjo una salida "mejor" que ffmpeg.

por si acaso, Avidemux y ffmpeg están en el repositorio estándar de Fedora Linux. (Estoy seguro de que también son estándar en otros sabores de Linux).

Máxima
fuente
1

-vno -aneliminará todas las pistas de video o audio. El suministro -vn -acodec copyeliminará el video; -an -vcodec copyeliminará todo el audio.

-vcodec copyespecifica que ffmpeg debe hacer una copia directa de la pista de video existente (y no hacer ningún procesamiento / codificación de la misma). Si no lo especifica, seguirá funcionando, pero ffmpeg puede volver a codificar la pista de video existente y la operación utilizará más CPU y puede llevar mucho más tiempo.

muchas patatas fritas
fuente
0

Usando avidemux en la línea de comandos.

(En la GUI de Avidemux, como se describe en https://unix.stackexchange.com/a/85834/4319 arriba, simplemente selecciona / deselecciona las pistas de audio y guarda el archivo. (Todo se copia en el nuevo AVI).)

Observé qué tipo de proyectos se guardan como proyectos SpiderMonkey o TinyPy para mis acciones, y resultó que el proyecto SpiderMonkey (JavaScript) carece de las acciones de selección de pistas de audio que necesitaba, pero el proyecto TinyPy (Python) sí tenía ellos.

Eliminé todo lo que no estaba relacionado (una docena de líneas innecesarias), y esto es lo que obtuve en mi some_series.py:

#PY  <- Needed to identify #
#--automatically built--

adm = Avidemux()

adm.audioClearTracks()
adm.audioAddTrack(1)

Deja la pista 1, pero deja la pista 0.

Luego ejecuté una conversión por lotes de muchos archivos con un comando como este:

for f in *.avi; do avidemux3_cli --nogui --load "$f" --run ../some_series.py --save ../some_series/"${f%%.rus.eng.avi}".eng.avi --quit; done

Copia todo, pero elimina todo menos la pista de audio necesaria.

Aprendí la forma de ejecutar avidemux desde la línea de comandos de https://www.avidemux.org/admWiki/doku.php?id=tutorial:batch_processing , aunque no mencionan los scripts de Python, solo los de JS ( que no funcionó para mí)

imz - Ivan Zakharyaschev
fuente
-1

Si no le importa que el programa sea GUI, con el editor de video de Blender puede hacer eso y mucho más.

YoMismo
fuente
-2

El ffmpegprograma ha sido reemplazado por avconv. avconvtiene un uso muy similar a ffmpeg, por lo tanto, todos los comandos en esta publicación pueden ser algo como:

avconv <old ffpmeg command line options>

Siga este enlace para instalar avconvsi está en Ubuntu.

SmallChess
fuente
-3

FFMPEG podría ser una solución útil para usted.

$ man ffmpeg
koolhead17
fuente
Tuve un breve vistazo, y es bastante denso. Busqué "audio" y "pista de audio" y nada parecía obvio.
tshepang
@Tshepang, "track" es ambiguo, por lo que probablemente el FFmpeg prefiere una terminología más precisa. FFmpeg considera que el audio viene en "secuencias", cada una de las cuales comprende uno o más "canales". AFAICT, cada canal es mono, con la secuencia que describe a qué salida (s) se debe enviar (panorámica) de forma predeterminada. Por ejemplo, una transmisión estéreo consta de dos canales, uno enviado a la salida izquierda de la tarjeta de sonido de forma predeterminada y el otro enviado a la salida derecha de la tarjeta de sonido de forma predeterminada.
sampablokuper