¿Cómo puedo extraer audio del video con ffmpeg?

227

Intenté el siguiente comando para extraer audio del video:

ffmpeg -i Sample.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 Sample.mp3

pero obtengo el siguiente resultado

libavutil     50.15. 1 / 50.15. 1
libavcodec    52.72. 2 / 52.72. 2
libavformat   52.64. 2 / 52.64. 2
libavdevice   52. 2. 0 / 52. 2. 0
libavfilter    1.19. 0 /  1.19. 0
libswscale     0.11. 0 /  0.11. 0
libpostproc   51. 2. 0 / 51. 2. 0
SamplE.avi: Invalid data found when processing input

¿Alguien puede ayudar, por favor?

usuario1269669
fuente

Respuestas:

406

Para extraer la secuencia de audio sin volver a codificar:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn No hay video.
  • -acodec copy dice que use la misma secuencia de audio que ya está allí.

Lea la salida para ver qué códec es, para establecer la extensión de nombre de archivo correcta.

Paul Irish
fuente
54
y en lugar de ejecutar ffmpeg por primera vez solo para verificar qué secuencia de audio es, use ffprobe input-video.avi
FlorianB
15
Si solo extrae audio de una transmisión de video, la duración del audio puede ser menor que la duración del video. Para asegurarse de que esto no suceda, extraiga el audio Y el video con la misma llamada a ffmpeg, por ejemplo, "ffmpeg -i vid.avi -map 0: a audio.wav -map 0: v onlyvideo.avi
BlenderBender
2
Sería genial expandir esta respuesta con un comando que también encapsula el AAC sin procesar en un contenedor M4A.
Gras Double
8
En este caso preciso, simplemente reemplace ".aac" con ".m4a" en la ruta de destino. ffmpeg es lo suficientemente inteligente como para adivinar su intención, y encapsula el resultado en un contenedor M4A :)
Gras Double
1
FWIW, he creado un script PHP, para que solo especifique el archivo de video de entrada, y automáticamente determina la extensión del archivo de audio de salida: superuser.com/questions/1301901/…
Gras Double
117

Para codificar un MP3 de alta calidad desde un AVI, utilice mejor -q: a para velocidad de bits variable:

ffmpeg -i sample.avi -q:a 0 -map a sample.mp3

Si desea extraer una porción de audio de un video, use la opción -ss para especificar la marca de tiempo de inicio y la opción -t para especificar la duración de la codificación, por ejemplo, de 3 minutos y 5 segundos durante 45 segundos:

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • Las marcas de tiempo deben estar en formato HH: MM: SS.xxx o en segundos.

  • Si no especifica la opción -t , se irá al final.

Ejemplo de trabajo:

  1. Descargar ffmpeg
  2. Abra un símbolo del sistema (Inicio> Ejecutar> CMD) o en un Linux / Mac abra una Terminal
  3. cd al directorio con el ffmeg.exe
  4. Emita su comando y espere el archivo de salida (o solucione cualquier error)

ingrese la descripción de la imagen aquí

Jeremy Thompson
fuente
3
Aquí hay una guía para los -q:avalores: trac.ffmpeg.org/wiki/Encode/MP3 Zero es la configuración de VBR de más alta calidad, que generalmente da como resultado tasas de bits promedio en la parte superior del rango de CBR sano (donde 320 kbit / s es el máximo, probablemente un poco más allá del punto en el que la compresión sin pérdida se vuelve más apropiada).
Evgeni Sergeev
3
¿Y que hace -map a?
Iulian Onofrei
Advertencia: esto es volver a codificar el audio con una compresión con pérdida, lo que degradará ligeramente la calidad. Si el original ya está comprimido, degradará la calidad dos veces, lo que puede ser notable o no.
Davidmh
Este comando funciona para mí, cuando el anterior con -vnno.
Mmm
12

La línea de comando es correcta y funciona en un archivo de video válido. Me aseguraría de que haya instalado la biblioteca correcta para trabajar con mp3, instale lame o probe con otro códec de audio.

Generalmente

ffmpeg -formats

o

ffmpeg -codecs

daría suficiente información para que sepa más.

Álvaro
fuente
11

ffmpeg -i sample.avile dará la información del formato de audio / video para su archivo. Asegúrese de tener las bibliotecas adecuadas configuradas para analizar las secuencias de entrada. Además, asegúrese de que el archivo no esté dañado.

smp
fuente
ahora, obtuve el resultado correcto cuando probé el mismo comentario con un .mkv vedio. Por qué no funciona para .avi, ¿hay algún comando ffmpeg para convertir .avi
user1269669
1
AVI o MKV se refiere al formato contenedor que puede contener muchos formatos diferentes de audio / video. No está buscando convertir audio AVI, está buscando convertir la pista de audio dentro del archivo AVI, que todavía no ha especificado. Use el comando que enumeré anteriormente para ver qué tipo de pista de audio está dentro del archivo AVI. Si es MP3, deberá compilar FFMPEG con una biblioteca de MP3 como LAME lame.sourceforge.net
smp
6

Para codificar audio mp3, ffmpeg.org muestra el siguiente ejemplo:

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

Extraje el audio de un video simplemente reemplazándolo input.wavcon el nombre del archivo de video. El 2medio 190 kb / seg. Puede ver los otros niveles de calidad en mi enlace de arriba.

Suragch
fuente
Ese ejemplo es para convertir un archivo de audio a un formato diferente, no para extraerlo de un video.
Iulian Onofrei
@IulianOnofrei, como describí en mi respuesta, puede reemplazar el archivo de audio con un archivo de video. Funcionó para mi.
Suragch
6

Esto es lo que acabo de usar:

ffmpeg -i my.mkv -map 0:3 -vn -b:a 320k my.mp3

Explicación de opciones:

  • my.mkv es un archivo de video de origen, también puede usar otros formatos
  • -map 0:3significa que quiero la tercera transmisión del archivo de video. Ponga su N allí: los archivos de video a menudo tienen múltiples transmisiones de audio; puede omitirlo o usarlo -map 0:apara tomar la secuencia de audio predeterminada. Ejecute ffprobe my.mkvpara ver qué secuencias tiene el archivo de video.
  • my.mp3 es un nombre de archivo de audio de destino, y ffmpeg descubre que quiero un MP3 de su extensión. En mi caso, el flujo de audio de origen es ac3 DTS y solo copiar no era lo que quería
  • 320k es un bitrate objetivo deseado
  • -vn significa que no quiero video en el archivo de destino
Artem Vasiliev
fuente
2

Solo una suposición:

-ab 192

debiera ser

-ab 192k

Parece que eso podría ser un problema, pero tal vez ffmpeg sea lo suficientemente inteligente como para corregirlo.

Caótico
fuente
2
Comentario válido, y edité la pregunta del OP para cambiarlo, pero esto no cambia nada (a lo sumo, esto produce una advertencia).
Jean-Philippe Pellet
2

Si el audio envuelto en el avi no tiene formato mp3 para empezar, es posible que deba especificarlo -acodec mp3como parámetro adicional. O sea cual sea su códec mp3 (en sistemas Linux es probable -acodec libmp3lame). También puede obtener el mismo efecto, independiente de la plataforma, al especificar -f mp3"forzar" el formato a mp3, aunque no todas las versiones de ffmpeg todavía admiten ese cambio. Su experiencia puede ser diferente.

Xheralt
fuente
2

Para extraer sin conversión, uso una entrada del menú contextual, como acción personalizada del administrador de archivos en Linux, para ejecutar lo siguiente (después de haber verificado qué tipo de audio contiene el video; ejemplo para video que contiene oggaudio):

bash -c 'ffmpeg -i "$0" -map 0:a -c:a copy "${0%%.*}".ogg' %f 

que se basa en el comando ffmpeg ffmpeg -i INPUT -map 0:a -c:a copy OUTPUT.

Lo he usado -map 0:1sin problemas, pero, como se dijo en un comentario de @LordNeckbeard, " 0:1no se garantiza que Stream sea ​​siempre audio. Usar en -map 0:alugar de -map 0:1evitará la ambigüedad".


fuente
1
Corriente 0:1no se garantiza que sea siempre de audio. Usar en -map 0:alugar de -map 0:1evitará la ambigüedad.
llogan
@ LordNeckbeard ~ Lo tendré en cuenta, gracias.
Solía mediainfodeterminar la pista de audio, y la elegí así: -map 0:a:1donde a: 1 es el segundo índice de pista de audio, ¡gracias! -c:a copylo hizo mucho más rápido!
Acuario Power
1

Para las personas que buscan la forma más sencilla de extraer audio de un archivo de video mientras conservan los parámetros del archivo de video original, puede usar:

ffmpeg -i <video_file_name.extension> <audio_file_name.extension>

Por ejemplo, ejecutando:

ffmpeg -i screencap.mov screencap.mp3

extrae un mp3archivo de audio de un movarchivo de video.

Iulian Onofrei
fuente
Simple y funciona. ¿Por qué todas las otras soluciones son tan complicadas? +1
Scott Biggs
1
La pregunta es, ¿por qué esto tiene un voto de eliminación?
Iulian Onofrei
-1

Use en -b:alugar de -abcomo -abestá desactualizado ahora, también asegúrese de que la ruta del archivo de entrada sea correcta.

Para extraer audio de un video, he usado el siguiente comando y funciona bien.

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-vn", "-ar", "44100", "-ac", "2", "-b:a", "256k", "-f", "mp3", outputFileAbsolutePath};

Aquí,

  • -y - Sobrescribir archivos de salida sin preguntar.
  • -i - FFmpeg lee de un número arbitrario de "archivos" de entrada especificados por el -i opción
  • -vn - Deshabilitar la grabación de video
  • -ar - establece la frecuencia de muestreo para transmisiones de audio si está codificada
  • -ac - Establecer el número de canales de audio.
  • -b:a - Establecer la tasa de bits de audio
  • -f - formato

Mira esto para mi muestra completa del proyecto de Android FFmpeg en GitHub.

Desarrollador de Android
fuente