【问题标题】:Mixing and Adding Silence to Audio Android/Java混合和添加静音到音频 Android/Java
【发布时间】:2019-09-11 17:54:32
【问题描述】:

我有 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);
}

音频始终关闭。有时一两秒太快,有时一两秒太慢太慢。我不认为这是时间问题,因为我首先启动音频记录(wav),然后设置启动计时器->启动媒体播放器(已经准备好)->结束计时器并将差异设置为“填充”变量。从 wav 标头中,我也跳过了 44kb。

任何帮助将不胜感激。

【问题讨论】:

    标签: java android audio mixing


    【解决方案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]);
        }
    

    要规范化数据,您需要遍历混合缓冲区并找到绝对最大值Math.abs(...),然后将数组中的所有值乘以 32,767/largestValue - 这将为您提供一个最大值适合的缓冲区变成没有剪裁的短片。然后遍历您的浮点数组,将每个值移回一个短数组。

    我不确定您的 minBufferSize 是什么 - 这需要足够大以混合您的所有数据。

    【讨论】:

    • 看起来您正在偏移stereoWavBuffer。我在这里正确吗? mp3Buffer 将首先启动,然后是 stereWavBuffer 一旦silenceSamples 大于 i?
    • 是的 - 我不确定你想要抵消哪一个,所以我选择了 WavBuffer。此外,您可能不想将混合数据除以二。最好将它们混合成一个浮点数组(为您提供 32 位分辨率),然后将浮点 [] 标准化为 16 位范围,然后再转换回短 []。我将更新我的示例...
    • 抱歉 - 您确实说过静音应该在 MP3 音频的开头 - 答案已更新
    猜你喜欢
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多