audiorecord android wear стойности 0

Опитвам се да получа силата на звука от моя часовник с Android Wear: MOTO 360. Но получавам само 0 PCM стойности от Audiorecord.read.....

Пускам процеса на запис в отделна тема. По-долу е извлечение от моя код, имате ли представа какво правя погрешно?

Голямо благодаря за помощта

jn.

REREDIT: нов резултат с MOTO. Изглежда наистина много странно!

03-15 20:38:08.740 1420-3994/? W/mot_vr_audio_hw﹕ Не позволява wake(), тъй като DSP е деактивиран

РЕДАКТИРАНЕ : Опитах кода си с различен ЧАСОВНИК (Sony). Дневниците са по-ясни

03-08 22:11:40.342 1165-1650/? D/MICRO﹕ ЩЕ ЗАПИСВА НА 44100Hz В БУФЕР ОТ 15052

03-08 22:11:40.343 153-153/? E/AudioPolicyManager﹕ startInput(21) неуспешен: друг вход 19 вече е стартиран

03-08 22:11:40.343 1165-1650/? Състояние E/AudioRecord﹕ start() -38

Тази грешка изглежда се задейства, когато 2 обекта на аудиозапис са активни едновременно. Но съм напълно сигурен, че моята се стартира само веднъж. Мислите ли, че може да е обект на системен аудиозапис, който предотвратява стартирането на моя?

РЕДАКТИРАНЕ: Имам това в моя манифест на износване uses-permission android:name=android.permission.RECORD_AUDIO

private int sampleRateInHz = 8000;
private int channelConfig = AudioFormat.CHANNEL_IN_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

public void run(){

    running=true;
    bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRateInHz, channelConfig, audioFormat, bufferSize);
    Log.d(TAG,"WILL RECORD AT "+sampleRateInHz+"Hz IN A BUFFER OF "+bufferSize);
    recording=true;

    try{
        while (recording){

            if ((recorder.getState()==android.media.AudioRecord.STATE_INITIALIZED)&&(recorder.getRecordingState()==android.media.AudioRecord.RECORDSTATE_STOPPED)){
                recorder.startRecording();
                Log.d(TAG,"START RECORDING DUDE");
            }

            int theVolume = getVolume(sampleRateInHz, bufferSize);

            Thread.sleep(10);
        }
        if (!recording){
            Thread.currentThread().interrupt();
            Log.d(TAG,"MIC THREAD STOPPED");
        }

    }catch (InterruptedException e){
        e.printStackTrace();
    }

private int getVolume(int sampleRate, int bufferSize){
    short[] audioData = new short [bufferSize];

    int nbOfSamples = recorder.read(audioData,0,bufferSize);

    int numSamples = audioData.length;
    int numCrossing = 0;
    double volume = 0;
    for (int p = 0; p < numSamples-1; p++){
        volume += audioData[p]*audioData[p];
    }

    Log.d(TAG,"volume from pcm: "+volume);
    volume = Math.sqrt(volume/nbOfSamples);


    currentVolume = (int) (0.5*currentVolume+ 0.5*volume);
    Log.d(TAG,"currentVolume: "+currentVolume);

    return currentVolume;
}

person bisonfute    schedule 06.03.2015    source източник


Отговори (1)


Повече от вашия код би било полезно. Но изглежда, че микрофонът вече се използва. Аз също се сблъсках с някои от тези проблеми. Ако изпълнявате това в нишка, може случайно да стартирате няколко нишки. Освен това, ако изпълнявате това в услуга, може да стартирате няколко услуги. Сега, ако направите търсене в Google, „могат ли да се изпълняват множество копия на една и съща услуга“, ще намерите много хора, които казват „не“. Но фактът е, че да, можете да имате няколко екземпляра на една и съща услуга, работещи едновременно. Моят съвет е да Log.d произволно число на всеки запис. За да сте сигурни, че само една нишка работи в даден момент

public void run(){
    int randThreadNumber = randInt(0,100);
    while (recording) {
        Log.d("MYTAG", "Rand number " + randThreadNumber);
        ..........more code.............
    }
    ..........more code.............
}

public static int randInt(int min, int max) {
    Random rand = new Random();
    int randomNum = rand.nextInt((max - min) + 1) + min;

    return randomNum;
}

Друго нещо, което може да доведе до невъзможност за достъп до записващото устройство на android Wear, е ако часовникът слуша „OK Google“, така че ако се опитате да заснемете аудио, докато часовникът е в състояние, което ще отговори на „OK Google“, аудиозаписът няма да работи.

Ето един добър начин да видите дали микрофонът е наличен

while(recording)
{
    readResult = audio_recorder.read(buf, 0, buf.length);

    //See if read worked
    if(readResult != -3) {
        // yay it worked. Do stuff
    } else {
        // if result is -3 then the watch's mic was inaccessible, wait then retry
        Log.d(TAG, "Waiting for Watch to give up Microphone");
        try {
            Thread.sleep(100, 0);
            audio_recorder.startRecording(); // restart audio recording
        } catch(Exception e) {
            Log.e(TAG, "exception", e); // Error trying to sleep thread
        }
    }
}

РЕДАКТИРАНЕ Също така извикването на Thread.sleep(10); между всяко повикване за четене е безполезно, тъй като методът за четене блокира. Ако няма какво да предложи, ще изчака и ще се върне, когато е готово.

person Benjamin    schedule 13.03.2015
comment
благодаря за чудесния отговор! Ще опитам вашия съвет за случайни числа, това е много добър съвет. Ще регистрирам и readresult=-3, за да мога да уловя този проблем. Ще ви уведомя за резултатите. Интересен момент е, че опитах същия код на друго устройство (sony smartwatch 3) и НЯМАМ ПРОБЛЕМ с достъпа до микрофона"..... - person bisonfute; 15.03.2015
comment
Не разбрах мисълта за твоя EDIT. Правя нишката да заспи СЛЕД read(). Защото не ми трябва много висока честота на семплиране на микрофона. I read() блокира, добре, но искам да поставя на пауза минимално време (може да е повече, ако read() блокира), преди да стартирам отново read()). Греша ли някъде? - person bisonfute; 15.03.2015
comment
Опитах се да прочета резултата от audiorecord.read() и той ми дава голямо положително число като 1323. Мисля, че това означава, че всичко изглежда правилно. Но днес имам нова ГРЕШКА: 03-15 20:38:08.740 1420-3994/? W/mot_vr_audio_hw﹕ Не позволява wake(), тъй като DSP е деактивиран - person bisonfute; 15.03.2015
comment
@bisonfute Ако все още имате проблеми, можете да ми изпратите съобщение в google plus plus.google.com/+BenjaminNykiel и мога да ви изпратя приложение, което направих, което използва AudioRecord, ако искате, само за да видя дали приложението ми работи. Ако стане, знам, че мога да ти помогна. Все пак не съм тествал приложението си на Moto 360, така че приложението ми може да не работи на вашия часовник. В този случай може да не мога да помогна. Така или иначе това ще помогне и на двама ни, тъй като бих искал да знам дали приложението ми не работи на Moto. - person Benjamin; 21.03.2015