Обработка на аудио в реално време Android

Опитвам се да направя някаква аудио обработка на Android в реално време.

Това, което имам досега, е приложение, което записва звук за предварително зададен период от време и го записва във WAV файл, който след това се обработва.

Това работи доста добре, но тъй като просто се интересувам от записване на импулсни отговори, си помислих, че може да е доста страхотно да накарам приложението ми автоматично да открива кога е възникнал импулс и просто да запазя пробите от 0,5 секунди преди импулса и до 1,5 секунди след това (общо 2 секунди).

Ето как се справям с байтовия масив на wav файла досега:

double audioSample = (double) (array[i+1] << 8 | array[i] & 0xff)/ 32767.0;

Това ми дава стойности между [-1,1], така че да кажем, че идеята ми е да считам за импулс всеки звук над 0,3 повече или по-малко. Мисля, че решението ще бъде за съхраняване на пробите в буфер и проверка на стойностите му в реално време, но не съм съвсем сигурен как да го приложа.

Знаете ли някакъв примерен код или нещо, което мога да разгледам?


person paviflo    schedule 13.06.2014    source източник


Отговори (1)


Вие сте на прав път. Вие ще искате да съхранявате вашите проби в кръгъл буфер, който е точно достатъчно голям, за да се справи с желания брой проби преди задействане. Можете лесно да намерите кръгъл буферен код в мрежата или SO. След като вашето условие за задействане е изпълнено, изхвърлете съдържанието на кръговия буфер върху диска, задайте условие и оттам записвайте на диска. Ето малко псевдо код, за да започнете.

void ProcessSamples(double[] samples)
{
    if (!triggered)
    {
        // write your level test here. Return -1 if you don't find anything
        // otherwise return the index of the sample.
        int triggerPos = SearchForTrigger(samples);
        if (triggerPos >= 0)
        {
            circularBuffer.Add(samples, triggerPos); // add up to the trigger pos
            WriteSamplesToFile(circularBuffer.GetSamples());
            triggered = true;
        }
        else
        {
            circularBuffer.Add(samples, samples.Length); // add all of the samples.
        }
    }
    else
    {
        WriteSamplesToFile(samples);
    }
}
person jaket    schedule 13.06.2014
comment
Опитвах се да работя върху това, но съм малко заседнал с размерите на буферните масиви. Ако искам кръговият буфер да ми даде 0,5 секунди проби, какъв размер трябва да бъде? Знам за AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING); но наистина не знам на какъв период от време съответства този bufferSize - person paviflo; 22.06.2014
comment
Зависи от честотата на дискретизация. При честота на семплиране от 48 kHz има 48 000 проби/сек, така че буфер от 0,5 секунди ще трябва да побере 24 000 проби. Удвоете това, ако имате два канала. Моят пример вече компенсира размера на извадката, като приеме, че пробите са били преобразувани в двойни преди буферирането. - person jaket; 23.06.2014
comment
Можете ли да ми помогнете с stackoverflow. com/questions/61184352/ въпрос - person Feroz Siddiqui; 13.04.2020