Extracción por lotes de audio con avconv sin transcodificación

14

Tengo alrededor de 70 archivos mp4 y quiero extraer los archivos de audio directamente sin necesidad de transcodificarlos. Todos los archivos mp4 tienen archivos de audio aac.

Entiendo que puedo usar el siguiente comando para extraer el archivo de audio de uno de los archivos mp4:

avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"

¿Cómo extraigo todos los archivos de audio de los 70 archivos mp4, de modo que termino con 70 archivos aac?

oshirowanen
fuente

Respuestas:

21

Puede usar un bucle for simple:

for i in *.mp4; do
    avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"
done

o en una línea:

for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"; done

Lo que hace se ejecuta avconvuna vez para cada archivo nombrado como *.mp4donde se almacena el nombre de archivo en la ${i}variable.

${i%.mp4}significa ${i}(es decir, el nombre del archivo) con .mp4despojado del final.

Andrew Gunnerson
fuente
2
IIRC, los archivos aac sin procesar no pueden contener metadatos; si desea mantener los metadatos de los archivos originales, use m4a (que es solo otro nombre para mp4, pero es bastante reconocido por los reproductores de audio) en lugar de aac como una extensión de archivo.
evilsoup
¿Para qué sirve la opción -map? ¿Por qué elige la secuencia 0: 1 en lugar de otras secuencias, como 0: 0, 0: 2?
qed
Dejé caer la opción -map y funciona bien
qed
para usar este comando en acciones personalizadas de Thunar y similares, funciona si se agrega a un script y en acciones de Thunar: bash /path/to/the/script %F- como aquí
2
@qed: la caída -mapaún puede hacer que se considere el video cuando se cambia a otro formato de salida (si ese formato puede contener audio y video). Es más seguro mantenerlo como está.
dr. Sybren 01 de
5

La respuesta de Xiao es generalmente la más útil si tiene todos los archivos en un directorio; pero si hay archivos MP4 dispersos en diferentes directorios, puede usar este findcomando para convertirlos a todos.

find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;

Esto utiliza una forma ligeramente diferente de sustitución de cadena bash al final: "$ {0 /% mp4 / m4a}" le dice a bash que reemplace mp4 con m4a, pero solo si el mp4 está al final de la cadena.

maldad
fuente
Nunca supe que bash tuviera ese tipo de sustitución. Impresionante :)
Andrew Gunnerson
1
@xiao Si omite el %, hará la sustitución de la primera instancia de la cadena que encuentre; también puede usar #para hacer que solo sustituya la cadena si está al comienzo de una variable; entonces $ {0 / mp4 / m4a} reemplazaría la primera instancia de mp4 con m4a (lo que podría ser un problema si tiene nombres de archivo realmente extraños); y $ {0 / # mp4 / m4a} sustituirá mp4 por m4a, pero solo si el valor de la cadena de la variable comienza con mp4 (no se usa aquí, obviamente, pero podría ser útil en otros lugares).
evilsoup
3

Para evitar que se procesen varios archivos al mismo tiempo (que podrían usar demasiados recursos), use parallel. Por defecto, solo hace un trabajo a la vez. Si desea utilizar múltiples núcleos de CPU en paralelo, intente parallel -j 4 ...4 trabajos en paralelo. También echa un vistazo man parallel.

sudo apt-get install parallel

Esta línea extraerá aacarchivos de audio de videos seleccionados y los colocará en m4acontenedores.

parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F

Cuando trabaje directamente en la CLI, sustitúyalo %Fpor la lista de sus archivos de entrada. Por ej *.mp4.

Inspirado por esta respuesta, por una respuesta anterior a esta pregunta, y por el comentario de evilsoup a esta última (diciendo: 'los archivos aac sin procesar no pueden contener metadatos; si desea mantener los metadatos de los archivos originales, use m4a (que es solo otro nombre para mp4, pero es bastante ampliamente reconocido por los reproductores de audio) en lugar de aac como una extensión de archivo ' ).

Yo uso tales comandos en acciones personalizadas de Thunar,

ingrese la descripción de la imagen aquí

limitar la aplicación a videos que contienen aacaudio.

ingrese la descripción de la imagen aquí

Para tener una ventana de terminal abierta durante el procesamiento, que se cierra al final, el comando se puede cambiar como:

 gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"
Comunidad
fuente
2

Extendí la respuesta de @ Xiao-Long Chen, convirtiéndola en un script que omite archivos cuando el archivo de salida es más nuevo:

#!/bin/bash

for file in *.mp4; do
    OUT="${file/.mp4/.m4a}"

    if [ "$file" == "$OUT" ]; then
        echo "Unable to handle $file" >&2
        exit 1
    fi

    if [ "$OUT" -nt "$file" ]; then
        echo "Skipping $file; output file is newer."
        continue
    fi

    echo "Converting \"$file\" -> \"$OUT\""
    avconv -loglevel warning -i "$file" -map 0:1 -c:a copy "$OUT"
done
Dr. Sybren
fuente