2012-01-19 1 views
23

Мне нужно проверить продолжительность группы аудиофайлов. Есть ли простой способ сделать это в командной строке unix?проверить длительность аудиофайлов в командной строке

> duration * 

У меня есть удивительное приложение SoX, у которого есть опция, называемая статистикой, которая генерирует набор аудиоинформации, включая продолжительность. Я ищу способ получить только продолжительность. Я гибкий в формате вывода, может быть любой длины образца, hh: mm: ss или seconds. Последний был бы моим преимуществом.

ответ

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

дает вам длину указанного файла.

+1

так завернуть, что в цикле и вы все сделали, 'для файла в формате * .mp3; do mp3info -p "% m:% s \ n" $ file; done'. Всем удачи. – shellter

+1

mp3info -p "% f% m:% s \ n" * .mp3 работает также - будет печатать имя файла и продолжительность –

25
soxi -D filename 
soxi -D * 

Soxi запрашивает метаданные аудиофайлов; D - опция продолжительности. Он поддерживает подтягивание. Старший брат Soxi sox выполняет обработку звука в командной строке.

+0

soxi - это то, что я тоже использую, но, к сожалению, ему не хватает поддержки m4a. – dan3

+0

Для ASF/WMV тоже , – galva

7

mediainfo вернет вам миллисекунды аудиофайла. Предполагая, что текущий каталог содержит только аудио файлы, следующие

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

Для расчета продолжительности всех аудио в локальном каталоге, this gist поможет:

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

Этот инструмент замечательный, работает и для файлов ogg, и доступен в репозиториях debian. – quantumbyte

+0

Я думаю, что для этого ответа требуются наименьшие ресурсы на машине, работающей по сравнению с другими ответами. –

+0

Только печатает пустую строку для меня. – JellicleCat

5

на OSX

печати длина каждого аудиофайла в текущем каталоге:

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

Включите FilePath:

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

MediaInfo может сделать это, но MediaInfo это один из тех полезных инструментов, который так плохо документированы, что вы почти должны знать, как использовать его для того, чтобы узнать, как использовать его (много происходит в мире Linux).

После нескольких часов испытаний и чтения с высоким и низким я наконец получил его для создания рекурсивного списка имен файлов с запятой и их продолжительности в миллисекундах.

кд в исходную директорию и выполните следующую команду:

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

Результаты будут выводиться в list.txt.

4

В дополнение к cdosborn-х answer, чтобы вычислить длину всех .mp3 файлов рекурсивно в подкаталогах текущего каталога и показать общий результат суммы в days:hours:minutes:seconds формате:

В 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))}' 

В Баш или 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))}' 

Результат такой: (7 дней, 5 часов, 6 минут, 58 секунд кунд):

$ 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

Другой soxi на основе ответа, включая имена файлов и длительность в часах, минутах и ​​секундах формат.

$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 
0

Раствор на основе MPlayer из commandlinefu по syssyphus, который работает с аудио и видео файлов:

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 

Получить общую длину всех видео/аудио в (и ниже) в H: m: s

Измените *.mp3 на то, что вы хотите совместить (например, *.avi, *.wav), вы можете удалить его полностью, если хотите проверить все файлы.

Пример вывода: 00:00:37