【问题标题】:Java - Convert 16bit Mono PCM raw data to stereoJava - 将 16 位 Mono PCM 原始数据转换为立体声
【发布时间】:2012-04-07 16:36:28
【问题描述】:

我正在将两个 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 音频速度正常,但听起来像花栗鼠。

【问题讨论】:

  • 你是说minBufferSize的一个缓冲区是N秒的音频,而另一个是2N秒的音频?
  • 我更新了问题,经过研究,将单声道转换为立体声似乎更好,但我仍然遇到问题。 minbufferSize 是立体声音频的 N 秒。所以当我以 1:1 混合 wavbuffer 时,它播放得太快了。
  • mixedBuffer 的操作有什么作用?如果您只是将一个样本添加到另一个样本并将结果四舍五入以适合 16 位,那么您将不会得到任何好的结果。你必须缩放结果。至于原始 WAV 数据,是的,您只需交错样本(假设您已经修复了数据头)。
  • 使用混合缓冲区我只是将每个音频缓冲区的短裤添加在一起。然后我将混合缓冲区输出到音轨进行播放。我还使用 FilterInputStream 删除了 wav 标头,因此它只是纯音频。

标签: android audio mixing audiotrack


【解决方案1】:

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

j < minBufferSize - 1

/2 意味着您永远不会读取所有波形缓冲区或写入整个立体声缓冲区,即使您只读取了一半波形缓冲区,因为这是所有数据,因为它是单声道,您仍然需要写入整个立体声缓冲。此外,您需要将 J 增加 1 而不是 2,以便读取每个单声道样本。

速度问题似乎是因为您应该在 j 处设置 stereowavebuffer,并且 k 都等于在 j 处的 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 打字!

【讨论】:

  • 天哪。太感谢了。那行得通。这是我第一次处理音频,所以我的逻辑完全错误。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多