【问题标题】:how to reverse AudioTrack play()如何反转 AudioTrack 播放()
【发布时间】:2015-06-12 18:32:30
【问题描述】:

我有一个充满音频数据的缓冲区(数组),填充了AudioRecord 方法。 我想玩这个反转。当我尝试反转缓冲区时,我得到了噪音。

public void startWriteAndPlayProcess (){
    writeAudio();
    playAudio();
}

private void writeAudio(){
     audioTrack.write(reverseArray(audioBuffer), 0, bufferSize);
}

private void playAudio(){
    audioTrack.play();
}

private byte []  reverseArray ( byte array []){
    byte  [] array1 = new byte [array.length];
    for (int i=0; i<array1.length; i++){
        array1[i]= array[array1.length-1-i];
    }
    return array1;
 }

你们可以推荐什么?

【问题讨论】:

    标签: audio audiorecord audiotrack


    【解决方案1】:

    基础音频样本实际上是一个 short 数组(16 位)或整数(24 位或 32 位)。如果您只是反转原始字节数组,那么您将最不重要的字节放在顶部,这将使您的信号听起来像噪音。要使其正常工作,您需要先将字节数组转换为正确类型的数组,然后将其反转,然后再将其转换回字节数组。

    private void writeAudio()
    {
        short[] shortArray = toShortArray(audioBuffer);
        short[] reversedShortArray = reverseArray(shortArray);
        byte[] reversedByteArray = toByteArray(reversedShortArray);
        audioTrack.write(reversedByteArray, 0, bufferSize);
    }
    
    private short[] toShortArray(byte[] byteArray)
    {
        short[] shortArray = new short[byteArray.length / 2];
        for (int i = 0 ; i < shortArray.length; i)
        {
             shortArray[i] = (short)((short)byteArray[i*2] | (short)(byteArray[i*2 + 1] << 8));
             // alternatively - depending on the endianess of the data:
             // shortArray[i] = (short)((short)byteArray[i*2] << 8 | (short)(byteArray[i*2 + 1]));
        }
        return shortArray;
    }
    

    当然,您必须更改 reverseArray 的类型。如果你需要的话,我会留给你弄清楚如何从短数组返回字节或编写它们的 int 版本。

    【讨论】:

    • 嗨。请帮我创建所有这些方法。音频未播放。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2021-10-07
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多