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

时间:2014-08-26 15:55:04

标签: java android audio

我录制音频然后用CheapAMR.java读取它。该类具有写入函数,该函数将读取文件的字节写入新文件中。是否可以更改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();
}

1 个答案:

答案 0 :(得分:1)

不,因为AMR是压缩格式 - 您必须实际解释数据才能以相反的顺序重新压缩它。

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