Проверить продолжительность аудиофайлов в командной строке
Мне нужно проверить продолжительность группы аудиофайлов.
Есть ли простой способ сделать это в командной строке unix?
> duration *
У меня есть потрясающее приложение SoX, у которого есть опция, называемая статистикой, которая генерирует набор аудиоинформации, включая продолжительность. Я ищу способ получить только продолжительность.
Я гибкий в формате вывода, может быть любой длины образца, hh: mm: ss или seconds.
Последнее было бы моим преимуществом.
Ответы
Ответ 1
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 }'
Ответ 2
soxi -D filename
soxi -D *
Soxi запрашивает метаданные аудиофайлов; D - опция продолжительности. Он поддерживает подтягивание. Старший брат Soxi sox выполняет обработку звука в командной строке.
Ответ 3
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
Ответ 4
ffmpeg -i <audiofile> 2>&1 | grep Duration
Ответ 5
в OSX
Печать длины каждого аудиофайла в текущем каталоге:
afinfo * | awk '/estimated duration/ { print $3 }'
Включить путь к файлу:
afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }'
Ответ 6
В дополнение к 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))}'
В 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
$
Ответ 7
sox --info -D file --> duration in seconds
sox --info -d file --> duration in HH:mm:ss.ss
sox --info file --> metadata
Ответ 8
Решение, основанное на mplayer из командной строки от 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
Получить общую длину всего видео/аудио в текущем каталоге (и ниже) в формате Ч: м: с
Измените *.mp3
на то, что вы хотите сопоставить (например, *.avi
, *.wav
), вы можете полностью удалить его, если хотите проверить все файлы.
Пример вывода: 00:00:37
Ответ 9
Другой 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
Ответ 10
mediainfo может это сделать, но mediainfo - один из тех полезных инструментов, которые так плохо документированы, что вам почти нужно знать, как его использовать, чтобы узнать, как его использовать (что очень часто происходит в мире Linux).
После нескольких часов испытаний и чтения с высоким и низким я наконец получил его для создания рекурсивного списка имен файлов с запятыми и их продолжительности в миллисекундах.
cd в стартовый каталог и выполните следующую команду:
find "$(pwd)" -type f -print0 | xargs -0 -I {} mediainfo --Inform="General;%CompleteName%,%Duration%" {} > list.txt
Результаты будут выводиться в list.txt.
Ответ 11
(Если вы не имеете afinfo
в вашем распоряжении) Я получил это рекурсивно для всех моих файлов
# install mp3info if not yet installed with
sudo apt-get install mp3info
с помощью команды find поместите общее количество секунд в файл csv (сначала перейдите в каталог, например, с mp3 файлами)
find . -name "*.mp3" -exec mp3info {} -p "%S\r\n" >> totalSeconds.csv \;
Затем откройте его, например, в LibreOffice и суммируйте в нижней части (чтобы получить часы) с помощью
=SUM(A{start}:A{end})/60/60
Ответ 12
ffprobe your_file.mp3 2>&1 | grep "Duration"
Вывод выглядит так:
Продолжительность: 00: 44: 33.50, начало: 0,011995, битрейт: 128 кб /