2012-01-19 19 views
23

Necesito verificar la duración de un grupo de archivos de audio. ¿Hay una manera simple de hacer esto en la línea de comandos de Unix?verificar la duración de los archivos de audio en la línea de comandos

> duration * 

que tienen la aplicación Sox que sorprende que tiene una opción llamada estadísticas que genera un conjunto de información de audio, incluyendo la duración. Estoy buscando una forma de obtener solo duración. Soy flexible en el formato de salida, podría ser cualquier longitud de muestra, hh: mm: ss o segundos. Este último sería mi preferencia.

Respuesta

15
mp3info -p "%m:%s\n" filename 

le da la longitud del archivo especificado.

+1

por lo que envuelva en un bucle y ya está todo listo, 'para archivo en * .mp3; hacer mp3info -p "% m:% s \ n" $ file; hecho'. Buena suerte a todos. – shellter

+1

mp3info -p "% f% m:% s \ n" * .mp3 funciona igual - imprimirá el nombre del archivo y la duración –

25
soxi -D filename 
soxi -D * 

Soxi consulta los metadatos de los archivos de audio; D es la opción de duración. Es compatible con globbing. El hermano mayor de Soxi, sox, procesa audio en línea de comandos.

+0

soxi es lo que yo también uso, pero desafortunadamente carece de compatibilidad con m4a – dan3

+0

Para ASF/WMV también . – galva

7

mediainfo le devolverá los milisegundos de un archivo de audio. Suponiendo que el directorio actual sólo tiene archivos de audio, la siguiente

mediainfo --Inform="Audio;%Duration%" "Miley Cyrus - Wrecking Ball.mp3" 

Para calcular la duración de todo el audio en el directorio local, this gist ayudará:

shopt -s nullglob 
let playlist_duration_ms=0 
for song_file in *.{mp3,ogg,m4a,flac,wav}; do 
    playlist_duration_ms=$(expr $playlist_duration_ms + $(mediainfo --Inform="Audio;%Duration%" "$song_file")) 
done 
shopt -u nullglob 

let playlist_duration_secs=$(expr $playlist_duration_ms/1000) 
let playlist_duration_mins=$(expr $playlist_duration_ms/60000) 
let playlist_duration_remaining_secs=$(expr $playlist_duration_secs - $(expr $playlist_duration_mins \* 60)) 

echo $playlist_duration_mins minutes, $playlist_duration_remaining_secs seconds 
+0

Esta herramienta es excelente, también funciona para archivos ogg y está disponible en los repositorios de debian – quantumbyte

+0

Creo que esta respuesta requiere menos recursos de la máquina que la ejecuta en comparación con otras respuestas. –

+0

Solo imprime una línea en blanco para mí. – JellicleCat

5

en OSX

Imprimir la longitud de cada archivo de audio en el directorio actual:

afinfo * | awk '/estimated duration/ { print $3 }' 

Incluir la ruta de archivo:

afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }' 
1

mediainfo puede hacer esto, pero MediaInfo es una de esas herramientas útiles que está tan mal documentado que casi se necesita saber cómo usarlo con el fin de aprender a usarlo (sucede mucho en el mundo de Linux).

Después de horas de pruebas y lecturas altas y bajas, finalmente logré generar una lista recursiva de nombres de archivos separados por comas y su duración en milisegundos.

cd al directorio de inicio y ejecute el siguiente comando:

find "$(pwd)" -type f -print0 | xargs -0 -I {} mediainfo --Inform="General;%CompleteName%,%Duration%" {} > list.txt 

Los resultados se dará salida a list.txt.

4

Además de answer, cdosborn para calcular la longitud de todos .mp3 archivos de forma recursiva en subcarpetas de directorio actual y mostrar el resultado de la suma total de days:hours:minutes:seconds formato:

En zsh:

afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' 

En bash o sh:

find . -name "*.mp3" -exec afinfo {} \; | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' 

El resultado es así (7 días, 5 horas, 6 minutos, 58 segundos onds):

$ afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' 
7:05:06:58 
$ 
1

Otra soxi respuesta basada incluyendo los nombres de los archivos y la duración en horas, minutos y segundos formato.

$for f in *amr; do printf "$f "; soxi -d $f; done 

DGT20161216.amr 00:22:04.62 
DGT20170108.amr 00:28:22.80 
DGT20170117.amr 00:20:05.18 
0
sox --info -D file    --> duration in seconds 
sox --info -d file    --> duration in HH:mm:ss.ss 
sox --info fils    --> metadata 
1
ffmpeg -i <audiofile> 2>&1 | grep Duration 
0

Una solución basada en MPlayer desde commandlinefu por syssyphus que funciona con archivos de audio y vídeo:

sudo apt-get install mplayer 
find -type f -name "*.mp3" -print0 | xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | tail -n 1 

obtener la longitud total de todo el vídeo/audio en el directorio actual (y abajo) en H: m: s

Cambie el *.mp3 a lo que quiera que coincida (por ejemplo, *.avi, *.wav), puede eliminarlo por completo si desea verificar todos los archivos.

Ejemplo de salida: 00:00:37

Cuestiones relacionadas