проверьте длительность аудио файлов в командной строке - PullRequest
34 голосов
/ 20 января 2012

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

> duration *

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

Ответы [ 12 ]

31 голосов
/ 21 января 2012
soxi -D filename
soxi -D *

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

24 голосов
/ 20 января 2012
mp3info -p "%m:%02s\n" filename

дает длину указанного файла в формате mm:ss (мм может быть больше 59).Всего за общее количество секунд в файле вы должны использовать:

mp3info -p "%S\n" filename

Чтобы получить общую длину всех mp3-файлов в секундах, AWK может помочь:

mp3info -p "%S\n" *.mp3 | awk 'BEGIN { s = 0 }; { s = s + $1 }; END { print s }'
12 голосов
/ 19 октября 2015

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

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

Чтобы рассчитать длительность всего аудио в локальном каталоге, этот список поможет:

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
10 голосов
/ 06 февраля 2018
ffmpeg -i <audiofile> 2>&1 | grep Duration
8 голосов
/ 27 февраля 2016

в OSX

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

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

Включение пути файла:

afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }'
4 голосов
/ 21 января 2017

В дополнение к ответу cdosborn , чтобы вычислить длину всех .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))}'

В bash или 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
$
3 голосов
/ 08 февраля 2018

Решение на основе 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

3 голосов
/ 29 сентября 2017
sox --info -D file             --> duration in seconds
sox --info -d file             --> duration in HH:mm:ss.ss
sox --info file                --> metadata 
2 голосов
/ 02 мая 2017

Другой ответ на основе 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
1 голос
/ 08 января 2017

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

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

перейдите в начальный каталог и введите следующую команду:

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

Результаты будут выведены в list.txt.

...