마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

음악 BPM 구하는 프로그램(오픈 소스 -> 작동이 안되네요 ㅜ)

0 추천
 protected Map doInBackground(File... songs) {
        for (int count = 0; count < songs.length; count++){
            String songName = songs[count].getAbsolutePath().split(songsFolder)[1].replaceAll("/","");
            int bpm = calculateBpm(songs[count]);
            publishProgress(songName, Integer.toString(bpm));
            bpmMap.put(songName, bpm);
        }
        return bpmMap;
    }

    private int calculateBpm(File song) {
        BPM2SampleProcessor processor = new BPM2SampleProcessor();
        processor.setSampleSize(1024);
        EnergyOutputAudioDevice output = new EnergyOutputAudioDevice(processor);
        output.setAverageLength(1024);
        AdvancedPlayer player;
        FileInputStream fileInputStream = null;
        BufferedInputStream inputStream = null;
        try {
            fileInputStream = new FileInputStream(song);
            inputStream = new BufferedInputStream(fileInputStream, 7 * 1024);
            player = new AdvancedPlayer(inputStream, output);
            player.play(1000,2000);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (JavaLayerException e) {
            e.printStackTrace();
        }

        int bpm = processor.getBPM();

        try {
            if(fileInputStream!=null)
                fileInputStream.close();

            if (inputStream != null)
                inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bpm;
    }

public class EnergyOutputAudioDevice extends BaseOutputAudioDevice {
    private int averageLength = 1024; 
    private Queue<Short> instantBuffer = new LinkedList<Short>();

    public EnergyOutputAudioDevice(SampleProcessor processor) {
        super(processor);
    }

    @Override
    protected void outputImpl(short[] samples, int offs, int len) throws JavaLayerException {
        for(int i=0; i<len; i++)
            instantBuffer.offer(samples[i]);

        while(instantBuffer.size()>averageLength*channels)
        {
            long energy = 0;
            for(int i=0; i<averageLength*channels; i++)
                energy += Math.pow(instantBuffer.poll(), 2);

            if(processor != null)
                processor.process(new long[] { energy });
        }
    }

    public int getAverageLength() {
        return averageLength;
    }

    public void setAverageLength(int averageLength) {
        this.averageLength = averageLength;
    }
}

04-28 02:30:27.443: E/AndroidRuntime(4100): FATAL EXCEPTION: AsyncTask #1

04-28 02:30:27.443: E/AndroidRuntime(4100): java.lang.RuntimeException: An error occured while executing doInBackground()

04-28 02:30:27.443: E/AndroidRuntime(4100): at android.os.AsyncTask$3.done(AsyncTask.java:299)

04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-28 02:30:27.443: E/AndroidRuntime(4100): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.lang.Thread.run(Thread.java:856)
04-28 02:30:27.443: E/AndroidRuntime(4100): Caused by: java.lang.NoClassDefFoundError: com.bpmprocessor.EnergyOutputAudioDevice
04-28 02:30:27.443: E/AndroidRuntime(4100): at com.beatzplayer.BPMCalculator.calculateBpm(BPMCalculator.java:89)
04-28 02:30:27.443: E/AndroidRuntime(4100): at com.beatzplayer.BPMCalculator.doInBackground(BPMCalculator.java:77)
04-28 02:30:27.443: E/AndroidRuntime(4100): at com.beatzplayer.BPMCalculator.doInBackground(BPMCalculator.java:1)
04-28 02:30:27.443: E/AndroidRuntime(4100): at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-28 02:30:27.443: E/AndroidRuntime(4100): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-28 02:30:27.443: E/AndroidRuntime(4100): ... 5 more
 
 
거짓말 아니고 1주일째 해결 못하고 있습니다... 도데체 뭐가 문제인건가요??
Noclassdeffounderror이 cause(원인)이라고 해서 인터넷도 찾아봐서 제시된 해결방법을 똑같이 했음에도 불구하고 진전이 없네요.. Energyoutputaudiodevice에서 super(process)부분부터 작동이 안되는 거 같은데, 아 도저히 모르겠네요. 제가 초보라서 오픈소스를 분석하고 있는데 이 오픈 소스는 뭐가 잘못 됐는지 도저히 모르겠네요. 자바 프로그래밍 잘하시는 분 한번만 제발 도와주세요. ㅜ
참고로 github.com에서 beatz-player이라고 치면 나오는 오픈소스입니다. 
Djleeee (13,180 포인트) 님이 2014년 4월 28일 질문

1개의 답변

+1 추천
 
채택된 답변
받아서 해보니 잘되는데요?

설정에서 build path > library 에서 각 jar 파일 지우고 다시 설정 해보세요.

클래스를 못찾는 일반적인 익셉션입니다.
달기살 (12,990 포인트) 님이 2014년 4월 28일 답변
Djleeee님이 2014년 11월 27일 채택됨
일단 다운받으시면
manifestxml에서 beatzPlayer이 아닌 beatzplayer로 고쳐야하고,
각 코드마다 com.beatzplayer.R이 있는데 이 부분에서 뻘겋게나와서 remove unused imports 적용하고 등등 다 했는데,
dalvik 관련 build path 문제 일어나서 인터넷 보고 똑같이 했지만
전 제가 작성한 위 logcat에 나오는 것이 똑같이 나옵니다. 도데체 어디가 잘못된건가요??
...