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

时间:2018-12-29 05:43:16

标签: android delphi firemonkey

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

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中录制了原始pcm音频。但是如何将其转换为 .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中转换此函数。任何人都可以对此进行指导。

1 个答案:

答案 0 :(得分:0)

该模型在Delphi中与在Java中非常相似。 Delphi有一个TBinaryWriter类可以做到这一点。另请参见provided example