Android - channel_in_stereo 中 2 个声道的 AudioRecord 拆分

Android - AudioRecord splitting of 2 channels in channel_in_stereo

我遇到了这个 link 但我不确定如何实现它 split two channels of AudioRecord of CHANNEL_IN_STEREO

我想把左右通道接收到的数据分开

下面是我的代码

for(int i = 0; i < read/2; i = i + 2)
{
    leftChannelAudioData[i] = data[2*i];
    leftChannelAudioData[i+1] = data[2*i+1];
    rightChannelAudioData[i] =  data[2*i+2];
    rightChannelAudioData[i+1] = data[2*i+3];
}

可在此处找到完整的源代码:http://pastebin.com/ntm1mHG0

我试过从第298行到第322行,但都不行。它反而使我的应用程序崩溃:/

谢谢大家!

你的关闭,但如果你考虑 i==read/2-1 的情况,你可以看到 data[2*i+2] 读取超出数组的末尾。由于您每次迭代都要经历样本,因此您需要像这样更改 for 循环:

for(int i = 0; i < read/4; i = i + 4)
{
    leftChannelAudioData[i] = data[4*i];
    leftChannelAudioData[i+1] = data[4*i+1];
    rightChannelAudioData[i] =  data[4*i+2];
    rightChannelAudioData[i+1] = data[4*i+3];
}

但现在的问题是您正在读取左侧的 2 个样本,然后是右侧的 2 个样本(例如 LLRRLLRR),但音频通常是交错的 LRLRLR。

for(int i = 0; i < read/2; i = i + 2)
{
    leftChannelAudioData[i] = data[2*i];
    rightChannelAudioData[i+1] = data[2*i+1];
}

一种适用于任意数量频道的更强大的工作方式是这样的:

double[][] deinterleaveData(double[] samples, int numChannels)
{
   // assert(samples.length() % numChannels == 0);
   int numFrames  = samples.length() / numChannels;

   double[][] result = new double[numChannels][];
   for (int ch = 0 ; ch < numChannels ; ch++)
   {
       result[ch] = new double[numFrames];
       for (int i = 0 ; i < numFrames ; i++)
       {
           result[ch][i] = samples[numChannels*i+ch];
       }
   }
   return result;
}