我将两个16位PCM样本混合到一个短缓冲区中。

// This is our buffer for PCM audio data
mp3Buffer = new short[minBufferSize];
wavBuffer = new short[minBufferSize];
mixedBuffer = new short[minBufferSize];

我用来自mp3和wav文件的样本填充这些缓冲区。我发现,wav文件将始终为单声道,而mp3始终为立体声。

我已经读过,如果您“仅分配一个缓冲区,其大小是原始PCM数据大小的两倍,而对于原始缓冲区中的每个样本,则将其两次放入新缓冲区中”
short[] stereoWavBuffer = new short[minBufferSize];
int k = 1;
for (int j = 0; j < minBufferSize / 2; j += 2)
{
    stereoWavBuffer[j] = wavBuffer[j];
    stereoWavBuffer[k] = wavBuffer[k];
     k += 2;

                }
                // TO DO -  Add the 2 buffers together

                for (int i = 0; i < minBufferSize; i++){
                    mixedBuffer[i] = (short)(mp3Buffer[i] + stereoWavBuffer[i]);
                }


                track.write(mixedBuffer, 0, minBufferSize);
}

我该怎么做?我试过了,但是wav音频现在处于正常速度,但听起来像花栗鼠。

最佳答案

在我看来,您的第一个for循环应该是

j < minBufferSize - 1

/ 2表示您将永远不会读取所有波形缓冲器或写入整个立体声缓冲器,即使您仅读取波形缓冲器的一半,因为这是全部数据,因为它是单声道,您仍然需要写入整个立体声缓冲器。另外,您需要将J加1而不是2,因此您需要读取每个单声道样本。

速度问题似乎是因为您应该将j和k的立体声波缓冲区都设置为等于j的wavebuffer。看来您实际上只是在复制原始Mono文件的一半。然后以立体声播放(即:将字节率加倍)。

我认为第一个循环应该看起来像这样
int k = 0;
for (int j = 0; j < minBufferSize / 2; j++) //Assuming you only have half a buffer since mono???
{
    stereoWavBuffer[k] = wavBuffer[j];
    stereoWavBuffer[k+1] = wavBuffer[j];
     k += 2;
}

编辑以修复错误的iPad输入!

关于android - Java-将16位单声道PCM原始数据转换为立体声,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10056280/

10-12 06:10