2012-01-06 2 views
0

현재 아티스트 이름, 파일 크기, 지속 시간 등과 같은 mp3 태그 데이터를 읽으려면 getID3()을 사용하고 있습니다.이 모든 작업은 사용자가 내 사이트에 파일을 업로드 할 때 즉시 수행됩니다.리눅스 명령 행/PHP bpm 탐지

그러나 데이터베이스에 저장하기 위해 각 노래의 bpm으로 자동으로 템포를 감지하고 싶습니다.

간단히 말해서 centOS 서버 또는 mp3 또는 wav 파일을 가져 와서 bpm으로 템포를 반환하는 PHP 기반 스크립트에서 실행할 수있는 명령 줄 유틸리티를 찾고 있습니다.

나는 soundstretch를 발견했으나 분명히 그렇게 할 수는 있지만 어떤 이유 때문에 설치가 불가능 해 보입니다.

누구에게 아이디어가 있습니까?

EDIT : 마침내 soundtouch/soundstretch를 성공적으로 설치했습니다.

저는 동적으로 PHP PHP 스크립트 내에서 호출하여 반환 bpm 값을 데이터베이스에 추가 할 수 있습니다. 변수 $ BPM 이제 BPM을 포함 할 것이라고 가정

내가 성공하지 다음에 시도

...

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

. 나는 soundtouch가 어떻게 작동하는지 오해해야합니다. 불행히도 설명서는 최소한입니다.

반환 된 BPM을 수집하여 내 데이터베이스에 저장하기 위해 변수로 저장하는 방법은 무엇입니까?

+1

"몇 가지 이유로"대신 그 오류를 게시 하시겠습니까? –

+0

독서에서 soundtouch/soundstretch에있는 bpm 감지는 기껏해야 flakey 인 것처럼 보입니다. 누군가 다른 제안이 있기를 바랬습니다. – gordyr

+1

모든 bpm 탐지는 flakey입니다. 수행 할 수있는 것은 빨아 들이기가 적음을 찾는 것입니다. –

답변

2

낡은 실이지만 어쩌면 누군가에게 도움이 될 수 있습니다.

먼저 mp3를 wav로 변환하십시오. 나는 그것이 그것이 최고로 작동한다는 것을 알아 차렸다. 사운드 스트레치가 결과를 shell_exec의 resutl에 반환하지 않는 것 같아서 추가 파일을 사용하고 있습니다. 당신이 나를보다 잘 알고 있다면 약간의 개선이있을 수 있습니다 ;-). 하나의 트랙의 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

체크 아웃 php-bpm-detect deseven에 의해, 그것은 매우 간단한 PHP 래퍼이며, 좋은 작품. 당신은 단지는 FFmpeg 및 soundstrech dependecies을 설치해야합니다

기본 사용법 :

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

여기 SoundStretch와 텍스트로 BPM을 얻을 수있는 bash는 명령 줄입니다.

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

SoundStretch 커맨드 라인 출력으로 stderrstdout 대신 사용하고있다. 소스 코드 (SoundStretch/main.cpp)에서 세부 정보를 확인할 수 있습니다.