我目前正在使用getID3()读取mp3标记数据,如艺术家姓名、文件大小、持续时间等。当用户将文件上载到我的网站时,所有这些都会即时发生。
不过,我想自动检测每首歌的bpm节奏,以便将其保存到我的数据库中。
所以简而言之,我在寻找一个可以从centOS服务器上运行的命令行实用程序,或者一个基于php的脚本,它将接收mp3或wav文件,对其进行分析,并以bpm的形式返回速度。
我找到了soundstretch,但它显然可以做到这一点,但由于某些原因似乎无法安装。
有人有什么想法吗?
编辑:我终于成功地安装了soundtouch/soundstretch。
我想从我的php上传脚本中动态调用它们,以便可以将返回的bpm值添加到数据库中。
我试着追随但没有成功。。。
$bpm = exec("soundstretch $filename -bpm");
假设变量$bpm现在将包含bpm。我一定是误解了soundtouch的工作原理。不幸的是,文档很少。
如何收集返回的bpm并将其存储为变量,以便将其保存到数据库中。
最佳答案
旧的线索,但也许它能帮助别人。
首先把mp3转换成wav。我注意到它是最好的。soundstretch似乎没有将结果返回到shell_exec的resultl中,因此我使用了一个附加文件。如果你比我更了解linux,那就可以做一些改进;-)。如果你需要一个又一个轨迹的bpm,它会起作用。
// 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];
关于php - Linux命令行/PHP bpm检测,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8752420/