Когда я искал в 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;
}
}