Командная строка Linux / обнаружение PHP bpm - PullRequest
0 голосов
/ 06 января 2012

В настоящее время я использую getID3 () для чтения данных тега mp3, таких как имя исполнителя, размер файла, продолжительность и т. Д. Все это происходит на лету, когда пользователь загружает файл на мой сайт.

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

Итак, в двух словах, я ищу либо утилиту командной строки, которую можно запустить с сервера centOS, либо скрипт на основе php, который будет принимать файл mp3 или wav, анализировать его и возвращать темп в виде bpm.

Я нашел soundstretch, но он, очевидно, может сделать это, но по некоторым причинам, кажется, не может его установить.

У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ: мне наконец-то удалось успешно установить soundtouch / soundstretch.

Я хотел бы вызывать их динамически из моего скрипта загрузки php, чтобы можно было добавить возвращаемое значение bpm в базу данных.

Я пытался следовать безуспешно ...

$bpm = exec("soundstretch $filename -bpm");

при условии, что переменная $ bpm теперь будет содержать bpm. Должно быть, я неправильно понимаю, как работает soundtouch. к сожалению документация минимальная.

Как бы я собрал возвращенный бит / мин и сохранил его как переменную, чтобы сохранить его в своей базе данных.

Ответы [ 3 ]

2 голосов
/ 18 апреля 2015

Старая тема, но, может быть, кому-то это поможет.

Сначала конвертируем mp3 в wav. Я заметил, что это работает с ним лучше всего. Кажется, что soundstretch не возвращает результат в результат shell_exec, поэтому я использую дополнительный файл. Можно добиться некоторого улучшения, если вы знаете Linux лучше меня ;-). Если вам нужен ударов в минуту трек один за другим, он работает.

// create new files, because we don't want to override the old files
$wavFile = $filename . ".wav";
$bpmFile = $filename . ".bpm";

//convert to wav file with ffmpeg
$exec = "ffmpeg -loglevel quiet -i \"" . $filename . "\" -ar 32000 -ac 1 \"" . $wavFile . "\"";
$output = shell_exec($exec);

// now execute soundstretch with the newly generated wav file, write the result into a file
$exec = "soundstretch \"" . $wavFile . "\" -bpm  2> " . $bpmFile;
shell_exec($exec);

// read and parse the file 
$output = file_get_contents($bpmFile);
preg_match_all("!(?:^|(?<=\s))[0-9]*\.?[0-9](?=\s|$)!is", $output, $match);

// don't forget to delete the new generated files
unlink($wavFile);
unlink($bpmFile);

// here we have the bpm
echo $match[0][2];
0 голосов
/ 04 октября 2016

Вот командная строка bash для получения BPM в виде текста с помощью SoundStretch.

soundstretch audio.wav -bpm 2>&1 | grep "Detected BPM" | awk '{print $4}'

SoundStretch использует stderr вместо stdout в качестве вывода командной строки. Вы можете проверить детали в их исходном коде (SoundStretch / main.cpp)

0 голосов
/ 23 января 2016

Проверьте php-bpm-detect от deseven, это очень простая обертка php и прекрасно работает.Вам просто нужно установить зависимости ffmpeg и soundstrech:

Основное использование:

$bpm_detect = new bpm_detect("file.mp3");  
echo $bpm_detect->detectBPM(); 
...