Java 我可以通过按相反顺序写入AMR数据字节来反向播放音频吗?

Java 我可以通过按相反顺序写入AMR数据字节来反向播放音频吗?,java,android,audio,Java,Android,Audio,我录制音频,然后用CheapAMR.java阅读。该类有一个write函数,它将读取文件的字节写入一个新文件。是否可以将for循环更改为向后写入字节,这样当我播放新文件时,它实际上会向后播放 public void WriteFile(File outputFile, int startFrame, int numFrames) throws java.io.IOException { outputFile.createNewFile(); FileInputSt

我录制音频,然后用CheapAMR.java阅读。该类有一个write函数,它将读取文件的字节写入一个新文件。是否可以将for循环更改为向后写入字节,这样当我播放新文件时,它实际上会向后播放

public void WriteFile(File outputFile, int startFrame, int numFrames)
        throws java.io.IOException {
    outputFile.createNewFile();
    FileInputStream in = new FileInputStream(mInputFile);
    FileOutputStream out = new FileOutputStream(outputFile);

    byte[] header = new byte[6];
    header[0] = '#';
    header[1] = '!';
    header[2] = 'A';
    header[3] = 'M';
    header[4] = 'R';
    header[5] = '\n';
    out.write(header, 0, 6);

    int maxFrameLen = 0;
    for (int i = 0; i < numFrames; i++) {
        if (mFrameLens[startFrame + i] > maxFrameLen)
            maxFrameLen = mFrameLens[startFrame + i];
    }
    byte[] buffer = new byte[maxFrameLen];
    int pos = 0;
    for (int i = 0; i < numFrames; i++) {
        int skip = mFrameOffsets[startFrame + i] - pos;
        int len = mFrameLens[startFrame + i];
        if (skip < 0) {
            continue;
        }
        if (skip > 0) {
            in.skip(skip);
            pos += skip;
        }
        in.read(buffer, 0, len);
        out.write(buffer, 0, len);
        pos += len;
    }

    in.close();
    out.close();
}
public void WriteFile(文件outputFile、int startFrame、int numFrames)
抛出java.io.IOException{
outputFile.createNewFile();
FileInputStream in=新的FileInputStream(mInputFile);
FileOutputStream out=新的FileOutputStream(outputFile);
字节[]头=新字节[6];
标题[0]=“#”;
标题[1]=“!”;
标题[2]=“A”;
标题[3]=“M”;
标题[4]='R';
标题[5]='\n';
out.write(头,0,6);
int maxFrameLen=0;
对于(int i=0;imaxFrameLen)
maxFrameLen=mFrameLens[startFrame+i];
}
字节[]缓冲区=新字节[maxFrameLen];
int pos=0;
对于(int i=0;i0){
in.skip(skip);
pos+=跳过;
}
读取(缓冲区,0,len);
out.write(缓冲区,0,len);
pos+=len;
}
in.close();
out.close();
}

否,因为AMR是一种压缩格式-您必须实际解释数据,以便按相反顺序重新压缩


如果您有一个简单的格式,比如线性PCM.wav文件,您可以通过重新排序样本来反转它。但是您需要小心跳过标题和任何嵌入的元数据。您不希望反转字节,而希望反转样本-通常(但不总是),这意味着读取左右两侧的16位样本(总的32位),并将其作为一个单元反转。如果您只是在标题后反转字节,您不仅会交换频道,而且会因为交换通常为16位的音频样本的高字节和低字节而获得绝对可怕的、最多是远程可理解的声音。

我想与其键入问题并等待回答,你可以简单地尝试一下,但可能失败了P@MrPixelDream-不,因为实验结果远不如基于对正在发生的事情的理解的结果确定。通过一个实验结果,你不知道你是否完成了你想做的事情的实质,或者你是否犯了一个小错误,比如用一种格式(与这里讨论的AMR不同)损坏了一个报头,在这种格式下,有效负载数据实际上是可以简单地可逆的。这无关紧要。你应该先试试再问。