#java #android #jar #media-player
#java #Android #jar #Медиаплеер
Вопрос:
Когда я искал в Google, я нашел Java-программу, созданную в netbeans для вычисления bpm песни. Он работал с большим количеством файлов JAR.
Я использовал тот же код для своего приложения для Android, и оно показало множество ошибок из-за отсутствия только одного файла JAR. Я добавил файл jar JLayer1.0.1, и все ошибки были устранены.
Сейчас приложение работает хорошо, но вычисление bpm создает некоторые новые проблемы. Он выдает bpm песни, которая длится менее 1 минуты, но другие песни не всегда обрабатываются в течение часа. И песни не воспроизводятся в фоновом режиме.
Когда я проверил с помощью программы Java, там она вычисляет bpm для всех песен, и песни были воспроизведены, и я могу это слышать.
С какой проблемой я здесь сталкиваюсь? Это все из-за файла 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;
}
}
Комментарии:
1. «Это дает время в минуту для песни, которое составляет менее 1 минуты, но другие песни не всегда обрабатываются в течение часа. И песни не воспроизводятся в фоновом режиме.» — что означает эта строка в вашем вопросе?
2. это означает, что он выдает bpm песни длительностью от 1 до 2 минут, но не получает песни длительностью более 2 минут. Либо происходит сбой, либо обнаружение bpm более часа. В коде Java, когда bpm будет показан, когда песня будет закончена после воспроизведения, там я могу слышать песню, но в Android project я не могу слышать песню, которая воспроизводится
3. вот что я имею в виду………..
4. Хорошо .. это делает все намного понятнее. Почему бы вам не опубликовать код?
5. вы уверены, что в песнях, с которыми ваше приложение не работает, есть информация о BPM проверьте песни в проводнике Windows с помощью свойств