2012-01-06 76 views
0

我目前使用getID3()來讀取mp3標籤數據,例如藝術家姓名,文件大小,持續時間等。當用戶將文件上傳到我的網站時,所有這些都會發生。Linux命令行/ PHP bpm檢測

但是我想自動檢測每首歌曲的bpm節奏,以便將它保存到我的數據庫中。

所以簡而言之,我正在尋找一個可以從centOS服務器運行的命令行實用程序或基於php的腳本,它將採用mp3或wav文件,分析它並以bpm形式返回節奏。

我已經找到了聲音,但它可以顯然這樣做,但由於某些原因似乎無法得到它安裝。

有沒有人有任何想法?

編輯:我終於成功地安裝了soundtouch/soundstretch。

我想從我的php上傳腳本中動態調用它們,以便返回bpm值可以添加到數據庫中。

我曾嘗試沒有成功以下...

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

假設變量$ BPM現在將包含BPM。我必須誤解soundtouch的工作原理。不幸的是文檔很少。

我將如何去收集返回的bpm並將其作爲變量存儲以便將其保存到我的數據庫中。

+1

「出於某些原因」,爲什麼不發佈那個錯誤呢? – 2012-01-06 02:09:49

+0

從閱讀中可以看出,soundtouch/soundstretch中的bpm檢測效果最好。我希望有人提出一些其他建議。 – gordyr 2012-01-06 02:12:35

+1

所有的bpm檢測都是一片混亂,你所能做的就是找到一個少的吸。 – 2012-01-06 02:21:13

回答

2

舊線程,但也許它可以幫助某人。

首先將mp3轉換爲wav。我注意到它最適合它。似乎聲音不會將結果返回到shell_exec的resute中,所以我使用了一個額外的文件。如果你知道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]; 
0

檢查由deseven出來php-bpm-detect,這是非常簡單的PHP的包裝和偉大工程。你只需要安裝的ffmpeg和soundstrech依賴條件:

基本用法:

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

這裏是bash命令行來獲得BPM與SoundStretch文本。

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

SoundStretch使用stderr代替stdout作爲命令行輸出。 你可以在他們的源代碼中檢查細節(SoundStretch/main.cpp)