首页 > 解决方案 > Android Studio java,混合两种不同长度的.wav音频,较短的一个循环播放

问题描述

应用目的图片我的目的是混合两个不同长度的 wav 音频,让它们同时播放。
一种是语音,另一种是背景声音。背景声音的长度很短。我需要循环播放背景声音,直到演讲结束。

问题是我的代码结果,音频长度不够,只播放了1/4,两个音频的声音大小没有按计划平衡。

for (int i=0; i<(data1.length+data2.length)/4; i++) 这里如果我不设置 (data1.length+data2.length)/4 程序将关闭。所以我不知道如何设置循环的长度。这是我的代码:</p>

private WavAudio wavMixing(WavAudio wav1, WavAudio wav2, double alpha) {
    WavAudio wav = new WavAudio();
    // perform the mixing as specified in the assignment and stored the mixed audio in wav
    // requirements:
    //  a) wav's duration should be same as wav1.
    //  b) if wav2 is shorter than wav1, then repeatedly use wav2 in a periodic manner

    // your code goes here
    // ***Create three byte[] to store data, wav1 data1, wav2 data2, wav data3***
    byte data1[] =  wav1.getData();
    byte data2[] =  wav2.getData();
    byte[] data3 = new byte[data1.length];

    /// ***Add the sum data of wav1 and wav2 to wav***
    for (int i=0; i<(data1.length+data2.length)/4; i++) {
        short buf1A = data1[i+1];
        short buf2A = data1[i];
        buf1A = (short) ((buf1A & 0xff) << 8);
        buf2A = (short) (buf2A & 0xff);

        short buf1B = data2[i+1];
        short buf2B = data2[i];
        buf1B = (short) ((buf1B & 0xff) << 8);
        buf2B = (short) (buf2B & 0xff);

        short buf1C = (short) (buf1A + buf1B);
        short buf2C = (short) (buf2A + buf2B);

        short res = (short) (buf1C + buf2C);

        data3[i] = (byte) res;
        data3[i+1] = (byte) (res >> 8);
    }

    // ***set wav data***
    wav.setData(data3);
    // ***() = 1() + (1 − )2() Make wav1 and wav2 have different volume levels***
    double rate = alpha*wav1.getRate() + (1-alpha)*wav2.getRate();
    // ***set new wav***
    wav.set((int) rate,wav1.getNumChannels(),wav1.getBitPerSample(),wav1.getNumSamples(),wav.getData());
    // ***wav duration = wav1 duration***
    wav.duration = wav1.getDuration();

    return wav;
}

标签: javaandroidandroid-studio

解决方案


推荐阅读