какой JAR-файл может быть использован для воспроизведения аудиофайла в Android - PullRequest
2 голосов
/ 06 мая 2011

Когда я искал в Google, я обнаружил Java-программу, созданную в NetBeans для расчета удельного веса песни.Он работал со многими файлами JAR.

Я использовал тот же код для своего приложения для Android, и он показал много ошибок из-за отсутствия только одного файла JAR.Я добавил JAR-файл JLayer1.0.1, и все ошибки были удалены.

Теперь приложение работает хорошо, но подсчет ударов в минуту создает некоторые новые проблемы.Это дает ударов в минуту песни, которая составляет менее 1 минуты, но другие песни не всегда были в процессе в течение часа.И песни не воспроизводились в фоновом режиме.

Когда я проверил с помощью программы на Java, она рассчитывает удары в минуту всех песен, и песни воспроизводятся, и я слышу это.

С какой проблемой я здесь сталкиваюсь?Это все из-за файла JAR, я должен использовать любые другие файлы JAR?Пожалуйста, помогите мне, друзья ....

Я добавляю часть своего кода

Player player = new Player(new FileInputStream("//sdcard//taxi.mp3"), output);

    public class BPM2SampleProcessor implements SampleProcessor {

        private Queue<Long> energyBuffer = new LinkedList<Long>();

        private int bufferLength = 43;

        private long sampleSize = 1024;
        private long frequency = 44100;
        private long samples = 0;
        private long beats = 0;
        private static int beatThreshold = 3;
        private int beatTriggers = 0;

        private List<Integer> bpmList = new LinkedList<Integer>();

        public void process(long[] sample) {
            energyBuffer.offer(sample[0]);
            samples++;
            if(energyBuffer.size() > bufferLength) {
                energyBuffer.poll();
                double averageEnergy = 0;
                for(long l : energyBuffer)
                    averageEnergy += l;
                averageEnergy /= bufferLength;

                double C = 1.3; //a * variance + b;
                boolean beat = sample[0] > C * averageEnergy;
                if(beat)
                {
                    if(++beatTriggers == beatThreshold)
                        beats ++;
                }
                else
                {
                    beatTriggers = 0;
                }

                if(samples > frequency * 5 / sampleSize) {
                    bpmList.add(getInstantBPM());
                    beats = 0;
                    samples = 0;
                }
            }
        }

        public void init(int freq, int channels) {
            frequency = freq;
        }


        public int getInstantBPM() {
            return (int)((beats * frequency * 60) / (samples * sampleSize));
        }

        public int getBPM() {
            Collections.sort(bpmList);
            return bpmList.get(bpmList.size() / 2);
        }

        public long getSampleSize() {
            return sampleSize;
        }

        public void setSampleSize(long sampleSize) {
            this.sampleSize = sampleSize;
        }

}

public class EnergyOutputAudioDevice extends BaseOutputAudioDevice {
    private int averageLength = 1024; // number of samples over which the average is calculated
    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;
    }
}
...