【问题标题】:Real time audio processing Android实时音频处理 Android
【发布时间】:2014-06-13 16:47:28
【问题描述】:

我正在尝试在 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 的声音的脉冲。 我认为解决方案是将样本存储在缓冲区中并实时检查其值,但我不太确定如何实现它。

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

【问题讨论】:

    标签: android audio buffer real-time audio-processing


    【解决方案1】:

    你在正确的轨道上。您需要将样本存储在一个足够大的循环缓冲区中,以处理您想要的预触发样本数量。您可以在 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.5 秒的样本,它应该是什么大小?我知道 AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING);但我真的不知道 bufferSize 对应的时间量是多少
    • 这取决于采样率。在 48kHz 采样率下,每秒有 48000 个样本,因此 0.5 秒的缓冲区需要容纳 24000 个样本。如果您有两个频道,请加倍。我的示例已经通过假设样本在缓冲之前已转换为双精度来补偿样本大小。
    • 你能帮我解决stackoverflow.com/questions/61184352/…的问题
    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2017-08-02
    • 1970-01-01
    • 2013-06-23
    相关资源
    最近更新 更多