我将两个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音频速度很快,但听起来像花栗鼠。
答案 0 :(得分:2)
在我看来,你的第一个for循环应该是
j < minBufferSize - 1
/ 2意味着你永远不会读取所有波形缓冲区或写入整个立体声缓冲区, - 即使你只读取了一半波形缓冲区,因为它是所有数据,因为它是单声道的,你仍然需要写入整个立体声缓冲。此外,您需要将J增加1而不是2,以便阅读每个单声道样本。
速度问题似乎是因为你应该在j处设置stereowavebuffer,并且在j处将k都设置为等于wavebuffer。看来你实际上只是复制原始单声道文件的一半。然后将其作为立体声播放(即:将字节速率加倍)。
我认为第一个循环看起来应该更像这样
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打字!