我录制音频然后用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();
}
答案 0 :(得分:1)
不,因为AMR是压缩格式 - 您必须实际解释数据才能以相反的顺序重新压缩它。
如果你有一个简单的格式,如线性PCM .wav文件,你可以通过重新排序样本来反转它。但是你需要小心跳过标题和任何嵌入的元数据。并且你不想反转字节而是 samples - 通常(但不总是)这意味着要为左右每个读取16位样本(总共32位)并将其作为一个单元进行反转。如果您只是颠倒了标题之后的字节,那么您不仅会交换频道,而且会因为交换通常为16位音频样本的高字节和低字节而获得绝对可怕的,最多远程可理解的声音。