TARSOS DSP для Android: получение SpectralPeaks
Я использую Tarsos Dsp для Android для получения спектральных пиков из аудиофайла. Начиная с версии 2, TarsosDSP не использует javax, что должно сделать все намного проще.
Что меня беспокоит, так это то, что мой код работает нормально, но android изо всех сил пытается отключить аудиофайл: похоже, это сделано с помощью avconv.
PipedAudioStream localPipedAudioStream = new PipedAudioStream(fileName);
TarsosDSPAudioInputStream localTarsosDSPAudioInputStream1 = localPipedAudioStream.getMonoStream(this.sampleRate);
Как создается декодер:
public PipeDecoder(){
//Use sensible defaults depending on the platform
if(System.getProperty("os.name").indexOf("indows") > 0 ){
pipeEnvironment = "cmd.exe";
pipeArgument = "/C";
}else{
pipeEnvironment = "/bin/bash";
pipeArgument = "-c";
}
pipeCommand = "avconv -i \"%resource%\" -vn -ar %sample_rate% -ac %channels% -sample_fmt s16 -f s16le pipe:1";
//pipeLogFile = new File("decoder_log.txt");
pipeBuffer = 10000;
}
Библиотеки avconv отсутствуют, или Android не может справиться с этими командами?
это вывод ошибки:
4651/com.example.giuseppe.tsptest I/PipeDecoder﹕ Starting piped decoding process for /sdcard/sample.wav
4651/com.example.giuseppe.tsptest W/PipeDecoder﹕ IO exception while decoding audio via sub process.Error running exec(). Command: [/bin/bash, -c, avconv -i "/sdcard/sample.wav" -vn -ar 44100 -ac 1 -sample_fmt s16 -f s16le pipe:1] Working Directory: null Environment: [ANDROID_ROOT=/system, EMULATED_STORAGE_SOURCE=/mnt/shell/emulated, LOOP_MOUNTPOINT=/mnt/obb, LD_PRELOAD=libsigchain.so, ANDROID_BOOTLOGO=1, EMULATED_STORAGE_TARGET=/storage/emulated, EXTERNAL_STORAGE=/storage/emulated/legacy, SYSTEMSERVERCLASSPATH=/system/framework/services.jar:/system/framework/ethernet-service.jar:/system/framework/wifi-service.jar, ANDROID_SOCKET_zygote=10, PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin, ANDROID_DATA=/data, ANDROID_ASSETS=/system/app, ASEC_MOUNTPOINT=/mnt/asec, BOOTCLASSPATH=/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/apache-xml.jar, ANDROID_PROPERTY_WORKSPACE=9,0, ANDROID_STORAGE=/storage]
02-20 17:53:54.020 4651-4651/com.example.giuseppe.tsptest W/System.err﹕ java.io.IOException: Error running exec(). Command: [/bin/bash, -c, avconv -i "/sdcard/sample.wav" -vn -ar 44100 -ac 1 -sample_fmt s16 -f s16le pipe:1] Working Directory: null Environment: [ANDROID_ROOT=/system, EMULATED_STORAGE_SOURCE=/mnt/shell/emulated, LOOP_MOUNTPOINT=/mnt/obb, LD_PRELOAD=libsigchain.so, ANDROID_BOOTLOGO=1, EMULATED_STORAGE_TARGET=/storage/emulated, EXTERNAL_STORAGE=/storage/emulated/legacy, SYSTEMSERVERCLASSPATH=/system/framework/services.jar:/system/framework/ethernet-service.jar:/system/framework/wifi-service.jar, ANDROID_SOCKET_zygote=10, PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin, ANDROID_DATA=/data, ANDROID_ASSETS=/system/app, ASEC_MOUNTPOINT=/mnt/asec, BOOTCLASSPATH=/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/apache-xml.jar, ANDROID_PROPERTY_WORKSPACE=9,0, ANDROID_STORAGE=/storage]
[...]
--------- beginning of crash
02-20 17:53:54.033 4651-4651/com.example.giuseppe.tsptest E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.giuseppe.tsptest, PID: 4651
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference
at be.tarsos.dsp.io.UniversalAudioInputStream.read(Unknown Source)
at be.tarsos.dsp.AudioDispatcher.processFirstBuffer(Unknown Source)
at be.tarsos.dsp.AudioDispatcher.runSourcedDispatcher(Unknown Source)
at be.tarsos.dsp.AudioDispatcher.run(Unknown Source) [...]
1 ответ
PipeDecoder
действительно зависит от платформы. Он работает только на машине (UNIX, Windows) с avconv
исполняемый подарок. Он работает, вызывая этот исполняемый файл, например, с сэмплированием MP3 с частотой 44,1 кГц, и возвращает по каналу декодированные сэмплы PCM с запрошенной частотой дискретизации. "Avconv" может быть заменен любым исполняемым файлом, который может декодировать, повторно дискретизировать и транслировать аудио через канал (например, ffmpeg и SoX).
Так как Android - это Unix, в принципе это может работать на Android, но на практике (насколько я знаю) сложно установить avconv на Android. Решение состоит в том, чтобы искать специфичные для платформы аудиодекодеры или библиотеки Java, которые предлагают эту функциональность (например, jlayer).
Если у вас есть сэмплы pcm, они могут легко войти в аудио-конвейер TarsosDSP.