我有2个文件。曾经是一个mp3被解码为pcm到一个流,我有一个wav被读入pcm也。样本以短数据类型保存。
音频统计:44,100个样本*每个样本16位* 2个通道= 1,411,200位/秒
我有X秒的沉默,我需要应用到mp3 pcm数据的开头,我这样做:
private short[] mp3Buffer = null;
private short[] wavBuffer = null;
private short[] mixedBuffer = null;
double silenceSamples = (audioInfo.rate * padding) * 2;
for (int i = 0; i < minBufferSize; i++){
if (silenceSamples > 0 ){
mp3Buffer[i] = 0; //Add 0 to the buffer as silence
mixedBuffer[i] = (short)((mp3Buffer[i] + stereoWavBuffer[i])/2);
silenceSamples = silenceSamples - 0.5;
}
else
mixedBuffer[i] = (short)((mp3Buffer[i] + stereoWavBuffer[i])/2);
音频始终关闭。有时它的一两秒太快,有时它的一两秒太慢太慢。我不认为它的时间有问题,因为我首先启动audiorecord(wav)然后设置启动计时器 - >开始媒体播放器(已经准备好) - &gt;结束计时器并将差异设置为“填充”变量。我也是从wav标题中跳过了44kb。
非常感谢任何帮助。
答案 0 :(得分:1)
我假设你想通过在其中一个流的开头插入填充来以某种方式对齐两个音频源?这里有一些问题。
mp3Buffer[i] = 0; //Add 0 to the buffer as silence
这不是在开头添加静音,只是将数组中offest [i]的条目设置为0.下一行:
mixedBuffer[i] = (short)((mp3Buffer[i] + stereoWavBuffer[i])/2);
然后只需覆盖此值。
如果你想以某种方式对齐流,最好的方法是不要在任一流的开头插入静音,而是在其中一个流中开始混合,而另一个流偏离另一个流。 。最好将它们混合成32位浮点数然后进行标准化。类似的东西:
int silenceSamples = (audioInfo.rate * padding) * 2;
float[] mixedBuffer = new float[minBufferSize + silenceSamples]
for (int i = 0; i < minBufferSize + silenceSamples; i++){
if (i < silenceSamples )
{
mixedBuffer[i] = (float) stereoWavBuffer[i];
}
else if(i < minBufferSize)
{
mixedBuffer[i] = (float) (stereoWavBuffer[i] + mp3Buffer[i-silenceSamples]);
}
else
{
mixedBuffer[i] = (float) (mp3Buffer[i-silenceSamples]);
}
要规范化您需要通过mixedBuffer运行的数据并找到绝对最大值Math.abs(...)
,然后将数组中的所有值多个32,767 / largestValue - 这将为您提供一个最大值的缓冲区适合短而不剪裁。然后迭代你的float数组,将每个值移回一个短数组。
我不确定你的minBufferSize
是什么 - 这需要足够大才能让你的所有数据混合在一起。