Я делаю приложение для анализа звука и контроля прожектора. Цвета прожектора меняются на ритм музыки. Я использую библиотеку 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
Проблема с AudioDispatcher, анализ в AudioDispatcherFactory не работает, tarsosdsp ⇐ Android
Форум для тех, кто программирует под Android
1738671735
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.
Подробнее здесь: [url]https://stackoverflow.com/questions/79411673/the-problem-with-the-audiodispatcher-the-analysis-in-audiodispatcherfactory-is[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия