我知道网上有很多资源解释如何解交织 PCM 数据。在我目前的项目过程中,我看过其中的大部分……但我没有音频处理方面的背景,而且我很难找到关于这种常见音频形式的存储方式的详细说明。
我确实知道我的音频将有两个通道,因此样本将以 [left][right][left][right] 的格式存储......我不明白这到底是什么意思。我还读到每个样本都以 [left MSB][left LSB][right MSB][right LSB] 格式存储。这是否意味着每个 16 位整数实际上编码了两个 8 位帧,或者每个 16 位整数都有其自己的帧用于左通道或右通道?
谢谢大家。任何帮助表示赞赏。
编辑:如果您选择给出示例,请参阅以下内容。
方法上下文
具体来说,我要做的是将交错的 short[] 转换为两个 float[],每个代表左声道或右声道。我将在 Java 中实现它。
public static float[][] deinterleaveAudioData(short[] interleavedData) {
//initialize the channel arrays
float[] left = new float[interleavedData.length / 2];
float[] right = new float[interleavedData.length / 2];
//iterate through the buffer
for (int i = 0; i < interleavedData.length; i++) {
//THIS IS WHERE I DON'T KNOW WHAT TO DO
}
//return the separated left and right channels
return new float[][]{left, right};
}
我目前的实施
我试过播放由此产生的音频。它非常接近,足够接近,你可以理解一首歌的歌词,但显然仍然不是正确的方法。
public static float[][] deinterleaveAudioData(short[] interleavedData) {
//initialize the channel arrays
float[] left = new float[interleavedData.length / 2];
float[] right = new float[interleavedData.length / 2];
//iterate through the buffer
for (int i = 0; i < left.length; i++) {
left[i] = (float) interleavedData[2 * i];
right[i] = (float) interleavedData[2 * i + 1];
}
//return the separated left and right channels
return new float[][]{left, right};
}
格式
如果有人想了解有关音频格式的更多信息,以下就是我所拥有的一切。
- 格式为 PCM 2 通道交错式大端线性 int16
- 采样率为 44100
- 每个 short[] 缓冲区的短裤数为 2048
- 每个 short[] 缓冲区的帧数为 1024
- 每个数据包的帧数为 1