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.

Другие вопросы по тегам