Android - AudioRecord在channel_in_stereo中拆分2个频道

时间:2015-09-22 19:31:38

标签: java android audio record android-audiorecord

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

我想分开左右声道收到的数据

以下是我的代码

     species      site  count   density
1:         A       1.1     25     0.419
2:         A       1.2    152     2.546
3:         A       2.1     26     0.436
4:         A       3.5      1     0.017
5:         A       3.7     98     1.641
---                         
101:       B       1.2      6     0.174
102:       B       1.3     10     0.291
103:       B       2.1      8     0.233
104:       B       2.2      8     0.233
105:       B       2.3      5     0.145

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

我已尝试从第298行到第322行,但它不起作用。它改为使我的应用程序崩溃:/

全部谢谢!

1 个答案:

答案 0 :(得分:1)

您的结束但是如果您考虑data[2*i+2]的情况,您可以看到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]; } 读取超出数组末尾的情况。由于每次迭代都需要进行样本处理,因此需要更改for循环:

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

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

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;
}

一种更有效的工作方式,适用于任意数量的频道,如下所示:

{{1}}