java - Android - AudioRecord 在channel_in_stereo 中分割2 个 channel

标签 java android audio record android-audiorecord

我发现了这个链接,但我不知道如何实现它 split two channels of AudioRecord of CHANNEL_IN_STEREO

我想分离左右 channel 接收到的数据

下面是我的代码

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 循环:

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

一种适用于任意数量 channel 的更强大的工作方式如下:

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

关于java - Android - AudioRecord 在channel_in_stereo 中分割2 个 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32725339/

相关文章:

android - 如何正确应用google服务插件?

audio - 带有元数据支持标签的音频文件格式?

python - 使特定频率(范围)更响亮

java - 解决 Tomcat 8.0.15 和 java 8 上的 tomcatproprietaryEvaluate 异常

Java问题(需要帮助)

java - Eclipse 提示 android 布局 xml 文件

适用于 Windows、Mac 和 iOS 的音频库? OpenAL/OpenSL

java - 一台机器上出现 NoSuchMethodError,但另一台机器上没有

java - 无法让 JavaFX 在 Eclipse 中运行

Android PreferenceScreen密码保护