[英]Convert PCM raw bytes to WAV bytes
I am listening to live phone calls and am able to get the raw PCM bytes. 我正在收听实时电话,并且能够获取原始PCM字节。 I also able to listen to these bytes through java's audio api.
我还能够通过Java的音频API收听这些字节。 These all works on an applet.
这些都可以在applet上运行。
Now I want to be able to convert the raw PCM bytes of the phone call to WAV bytes so I could write it directly to a ServletOutputStream. 现在,我希望能够将电话的原始PCM字节转换为WAV字节,以便可以将其直接写入ServletOutputStream。 This would allow browsers to actually listen to the phone calls.
这将允许浏览器实际收听电话。
Does anybody have any idea how I would be able to convert, on the fly, some raw PCM bytes[] to WAV bytes[]? 有人知道我将如何将某些原始PCM字节[]转换为WAV字节[]吗?
The examples I've seen all pertain to converting a file to another file. 我所看到的示例都与将文件转换为另一个文件有关。
How can I write a WAV file from byte array in java? 如何在Java中从字节数组写入WAV文件?
Thank you. 谢谢。
I was also stuck in quite same situation, here's how I figured things out. 我也陷入了同样的境地,这就是我如何解决问题的方式。
public static boolean getWavFile(String filePath, InputStream audioStream) throws IOException {
boolean result = false;
try {
byte[] decodedData = IOUtils.toByteArray(audioStream);
System.out.println(">>Decoded Data" + Arrays.toString(decodedData));
File outFile = new File(filePath);
AudioFormat format = new AudioFormat(8000, 16, 1, true, false);
AudioSystem.write(new AudioInputStream(new ByteArrayInputStream(
decodedData), format, decodedData.length), AudioFileFormat.Type.WAVE, outFile);
result = true;
return result;
} catch (IOException ex) {
System.out.println("<<getWavFile - impl" + ex);
return result;
}
}
It is been a while but I think this might help someone. 已经有一段时间了,但我认为这可能会对某人有所帮助。 Here is my solution - I am writing bytes back to the any output stream (In my case it is servletoutputstream).
这是我的解决方案-我将字节写回到任何输出流(在我的情况下是servletoutputstream)。 First, I write WAV header(44 bytes) to output stream and write the pcm bytes (You need to convert pcm data to byte array).
首先,我写入WAV标头(44字节)以输出流并写入pcm字节(您需要将pcm数据转换为字节数组)。 I used audio tag in html and specified src tag as my api url and it worked perfectly fine.
我在html中使用了音频标签,并将src标签指定为我的api网址,并且效果很好。
public void streamCloudObject(OutputStream stream, InputStream pcmData) throws IOException {
stream.write(WAVHeader.build(44100,5242880));
//byte_chunk_size is stream buffer size, I have it as 1MB, so at a time you are streaming 1MB of bytes
byte[] outBytes = new byte[BYTE_CHUNK_SIZE];
while(true) {
int r = pcmData.read(outBytes);
if(r == -1)
break;
stream.write(outBytes,0,r);
}
}
public class WAVHeader {
private static final int CHUNK_SIZE = 36;
private static final int BIT_RATE_16 = 16;
private static final int MONO = 1;
private static final int HEADER_SIZE = 44;
//inputStreamLength - I send the pcm filesize here and I get it from s3.
public static byte[] build(int sampleRate,int inputStreamLength) {
byte[] header = new byte[HEADER_SIZE];
int srate = resp.getSampleRate();
int channel = MONO;
int format = BIT_RATE_16;
long dataLength = inputStreamLength;
long totalDataLen = dataLength + CHUNK_SIZE;
long bitrate = srate * channel * format;
header[0] = 'R';
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
header[4] = (byte) (totalDataLen & 0xff);
header[5] = (byte) ((totalDataLen >> 8) & 0xff);
header[6] = (byte) ((totalDataLen >> 16) & 0xff);
header[7] = (byte) ((totalDataLen >> 24) & 0xff);
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
header[12] = 'f';
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
header[16] = (byte) format;
header[17] = 0;
header[18] = 0;
header[19] = 0;
header[20] = 1;
header[21] = 0;
header[22] = (byte) channel;
header[23] = 0;
header[24] = (byte) (srate & 0xff);
header[25] = (byte) ((srate >> 8) & 0xff);
header[26] = (byte) ((srate >> 16) & 0xff);
header[27] = (byte) ((srate >> 24) & 0xff);
header[28] = (byte) ((bitrate / 8) & 0xff);
header[29] = (byte) (((bitrate / 8) >> 8) & 0xff);
header[30] = (byte) (((bitrate / 8) >> 16) & 0xff);
header[31] = (byte) (((bitrate / 8) >> 24) & 0xff);
header[32] = (byte) ((channel * format) / 8);
header[33] = 0;
header[34] = 16;
header[35] = 0;
header[36] = 'd';
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
header[40] = (byte) (dataLength & 0xff);
header[41] = (byte) ((dataLength >> 8) & 0xff);
header[42] = (byte) ((dataLength >> 16) & 0xff);
header[43] = (byte) ((dataLength >> 24) & 0xff);
return header;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.