Проблема с AudioDispatcher, анализ в AudioDispatcherFactory не работает, tarsosdspAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с AudioDispatcher, анализ в AudioDispatcherFactory не работает, tarsosdsp

Сообщение Anonymous »

Я делаю приложение для анализа звука и контроля прожектора. Цвета прожектора меняются на ритм музыки. Я использую библиотеку TarsosDSP для этого, дополнительно загрузил библиотеку FFMPEG-KIT для преобразования аудио в формат WAV, PCM 16L для работы с AudioDispatcher.
Проблема заключается в том, что при передаче аудио в правильном формате запускает и сразу же запускает и сразу же диспетчер. заканчивается Логический метод процесса не выполняется, но метод Process Fellow () выполняется. Я обнаружил, что поток запускается, файл не пуст, он преобразуется в правильный формат, но метод getFrameLength (), когда я взаимодействует с AudioStream, к которому я передаю FilePath, возвращает значение пути файла -1, что На самом деле это не заполнено. Я уже искал все, и код библиотеки Github, и все нейронные сети, я не знаю, как решить эту проблему. Проблема в том, что AudioDispatcher и AudioDispatcherFactory.from pipe ()? < /P>
private void playAndAnalyzeAudio(String filePath, Uri uri)
{
if (mediaPlayer != null)
mediaPlayer.release();
mediaPlayer = MediaPlayer.create(requireContext(), uri);

new Thread(() -> {
extractAudio(inputFilePath, outputFilePath);
getActivity().runOnUiThread(() -> {
mediaPlayer = MediaPlayer.create(requireContext(), uri);
if (mediaPlayer != null) {
mediaPlayer.start(); // Start music after analyze
startSendingData(); // Start data sending
}
});
}).start();
}

private void analyzeAudio(String filePath)
{
try {
AudioDispatcher audioDispatcher = AudioDispatcherFactory.fromPipe(filePath, 44100, 1024, 0);
MFCC mfcc = new MFCC(1024, 44100, 13, 50, 20, 10000);
audioDispatcher.addAudioProcessor(mfcc);
Log.d("AUDIO_ANALYSIS", "Начинаем анализ аудиофайла..." + audioDispatcher);
audioDispatcher.addAudioProcessor(new AudioProcessor() {
@Override
public boolean process(AudioEvent audioEvent) {
Log.d("AUDIO_ANALYSIS", "Обрабатываем аудио...");

float[] amplitudes = audioEvent.getFloatBuffer();
Log.d("AUDIO_ANALYSIS", "Размер буфера: " + amplitudes.length);

float[] mfccs = mfcc.getMFCC();
if (mfccs == null) {
Log.e("AUDIO_ANALYSIS", "MFCC не сгенерировался!");
return true;
}

float currentBass = mfccs[0] + mfccs[1];
float totalEnergy = 0;
for (float amp : amplitudes) {
totalEnergy += Math.abs(amp);
}

Log.d("AUDIO_ANALYSIS", "Bass Energy: " + currentBass + ", Total Energy: " + totalEnergy);

if (currentBass > BASS_THRESHOLD || totalEnergy > ENERGY_THRESHOLD) {
changeColor();
Log.d("SONG", "Color wac changed on a : " + currentColor);
brightness = MAX_BRIGHTNESS;
} else {
brightness *= 0.9f;
}

return true;
}

@Override
public void processingFinished() {
getActivity().runOnUiThread(() -> Toast.makeText(requireContext(), "Анализ завершён", Toast.LENGTH_SHORT).show());
}
});
File file = new File(filePath);
if (!file.exists() || file.length() == 0) {
Log.e("AUDIO_ANALYSIS", "Error: file is empty! " + filePath);
return;
} else {
Log.d("AUDIO_ANALYSIS", "File is, size: " + file.length() + " byte.");
}
Log.d("AUDIO_ANALYSIS", "Start of analyzing: " + filePath);
File ffmpegFile = new File(getContext().getCacheDir(), "ffmpeg");
if (!ffmpegFile.setExecutable(true)) {
Log.e("AUDIO_ANALYSIS", "You don't have any roots for ffmpeg!");
}
else
Log.e("AUDIO_ANALYSIS", "You have roots for ffmpeg!");

new Thread(() -> {
Log.d("AUDIO_ANALYSIS", "Start dispatcher...");
audioDispatcher.run();
Log.d("AUDIO_ANALYSIS", "Dispatcher end.");
}).start();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(requireContext(), "Error of analyzing", Toast.LENGTH_SHORT).show();
}
}
public void extractAudio(String inputFilePath, String outputFilePath) {
File outputFile = new File(outputFilePath);
if (outputFile.exists()) {
outputFile.delete(); // Удаляем существующий файл
}
// Строим команду для извлечения аудио
String command = "-i " + inputFilePath + " -vn -acodec pcm_s16le -ar 44100 -ac 2 " + outputFilePath;

// Используем FFmpegKit для выполнения команды
FFmpegKit.executeAsync(command, session -> {
if (session.getReturnCode().isSuccess()) {
Log.d("AUDIO_EXTRACT", "Аудио извлечено успешно: " + outputFilePath);
analyzeAudio(outputFilePath); // Продолжаем анализировать аудио
} else {
Log.e("AUDIO_EXTRACT", "Ошибка извлечения аудио: " + session.getFailStackTrace());
}
});
}
< /code>
Извините за количество строк, я попытался описать эту проблему очень подробно. Метод недоступен в Android, только в Java, как я вижу ошибку "javax.sound ..., неожиданная ошибка, метод недоступен"
Я попытался изменить строку команду в методе receamuadio (), Чтобы изменить аргументы метода frompipe (), но не имел успеха.
Я хочу, чтобы мой аудиофайл был правильным анализом с AudioDispatcher, а затем, эти данные из анализа будут переданы в Arduino. Теперь в журналах я вижу «Цвет: NULL, значение: 0,0.

Подробнее здесь: https://stackoverflow.com/questions/794 ... factory-is
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»