在 firemonkey 中将原始 pcm 音频转换为 wave 音频 android

convert raw pcm audio to wave audio in firemonkey android

如何在 firemonkey 中转换原始 pcm 音频数据 android。

APath := TPath.GetSharedDownloadsPath + PathDelim + 'test.raw';

If (mRecorder.getState = TJAudioRecord.JavaClass.STATE_INITIALIZED) then
begin


mRecorder.startRecording;

memory := TMemoryStream.Create;
while isRecording do Begin
  bytesRead := bytesRead + mRecorder.read(mBuffer, 0, mBuffer.Length);
  memory.Write(mBuffer.Data^, mBuffer.Length);  //mBuffer is TJavaArray<Byte>;
End;

memory.SaveToFile(APath);




 SampleRateInHz := 16000;
 mRecorder := TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.MIC,
                          SampleRateInHz, TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
                          TJAudioFormat.JavaClass.ENCODING_PCM_16BIT,
                          bufferSize);

通过使用上面的代码,我成功地在 android 中录制了 raw pcm 音频。但是如何将其转换为.wave file。该文件在 audacity 中运行良好,但我无法将其转换为 wave 音频 文件。

我已经在 java 中测试过,具有以下功能

  /* Converting RAW format To WAV Format*/
    private void rawToWave(final File rawFile, final File waveFile) throws IOException {

        byte[] rawData = new byte[(int) rawFile.length()];
        DataInputStream input = null;
        try {
            input = new DataInputStream(new FileInputStream(rawFile));
            input.read(rawData);
        } finally {
            if (input != null) {
                input.close();
            }
        }
        DataOutputStream output = null;
        try {
            output = new DataOutputStream(new FileOutputStream(waveFile));
            // WAVE header
            writeString(output, "RIFF"); // chunk id
            writeInt(output, 36 + rawData.length); // chunk size
            writeString(output, "WAVE"); // format
            writeString(output, "fmt "); // subchunk 1 id
            writeInt(output, 16); // subchunk 1 size
            writeShort(output, (short) 1); // audio format (1 = PCM)
            writeShort(output, (short) 1); // number of channels
            writeInt(output, SAMPLE_RATE); // sample rate
            writeInt(output, SAMPLE_RATE * 2); // byte rate
            writeShort(output, (short) 2); // block align
            writeShort(output, (short) 16); // bits per sample
            writeString(output, "data"); // subchunk 2 id
            writeInt(output, rawData.length); // subchunk 2 size
            // Audio data (conversion big endian -> little endian)
            short[] shorts = new short[rawData.length / 2];
            ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
            ByteBuffer bytes = ByteBuffer.allocate(shorts.length * 2);
            for (short s : shorts) {
                bytes.putShort(s);
            }
            output.write(bytes.array());
        } finally {
            if (output != null) {
                output.close();
                rawFile.delete();
            }
        }


    }

效果很好。但我无法在 delphi firemonkey 中转换此功能。谁能指导一下。

Delphi 中的模型与 Java 中的模型非常相似。 Delphi 也有一个 TBinaryWriter class that can do this. See the provided example