2014-06-13 141 views
2

我正试图在Android上实时进行一些音频处理。实时音频处理Android

我到目前为止是一款应用程序,它可以在预定义时间内按时记录声音,并将其保存在WAV文件中,然后进行处理。

这个工程相当不错,但是,因为我只是对录制冲动响应感兴趣,所以我认为让我的应用程序在发生冲动时自动检测并且保留0,5 seg在冲动之前,直到1.5秒后(总共2秒)。

这是我如何对付wav文件的字节数组至今:

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

这给了我[-1,1]之间的值,因此,可以说,我的想法是考虑到有关一个或多或少超过0,3的任何声音的冲动。 我认为解决方案是将样本存储在缓冲区中并实时检查其值,但我不太确定如何实现它。

你们知道任何示例代码或我可以看看吗?

回答

2

你在正确的轨道上。您需要将样本存储在循环缓冲区中,该缓冲区的大小足以处理所需的预触发样本数。您可以在Web或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); 
    } 
} 
+0

我一直在试图解决这个问题,但我对缓冲区数组的大小感到困惑。如果我想循环缓冲区给我0.5秒的样本,它应该是多大?我知道AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,\t \t RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING);但我真的不知道该缓冲区大小对应的时间量是多少 – paviflo

+0

这取决于采样率。在48kHz采样速率下,每秒钟有48000个样本,因此0.5秒缓冲区需要保存24000个样本。双倍,如果你有两个频道。我的示例已经通过假设样本在缓冲之前转换为双倍来补偿样本大小。 – jaket