php - Linux命令行/PHP bpm检测

标签 php linux centos soundtouch

我目前正在使用 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 的结果中,所以我使用了一个额外的文件。如果您比我更了解 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/

相关文章:

php - 这样你就可以从任何目录调用 Composer

php - MySQL PHP-SELECT WHERE id = array()

java - 在没有 openjdk 依赖的情况下安装 cassandra

c - 为什么我们在调用bind()时将sockaddr_in转换为sockaddr?

linux - 中断处理程序可以写入 FIFO

bash - 如何自动运行 crons?

linux - clone/fork/vfork后父子进程返回地址不同

php - 是否可以使用 Redbean ORM 设置 2 个单独的唯一字段

javascript - 处理哈希数据的最佳算法

linux - 文件的最后一行被截断