将PCM原始字节转换为WAV字节

编程入门 行业动态 更新时间:2024-10-27 08:30:19
本文介绍了将PCM原始字节转换为WAV字节的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在收听实时电话,并且能够获取原始PCM字节. 我还能够通过Java的音频API收听这些字节. 这些都可以在applet上使用.

I am listening to live phone calls and am able to get the raw PCM bytes. I also able to listen to these bytes through java's audio api. These all works on an applet.

现在,我希望能够将电话的原始PCM字节转换为WAV字节,因此我可以将其直接写入ServletOutputStream.这样一来,浏览器就可以真正收听电话了.

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. This would allow browsers to actually listen to the phone calls.

有人知道我将如何将某些原始PCM字节[]转换为WAV字节[]?

Does anybody have any idea how I would be able to convert, on the fly, some raw PCM bytes[] to WAV bytes[]?

我所看到的示例都与将文件转换为另一个文件有关.

The examples I've seen all pertain to converting a file to another file.

将Java pcm转换为wav

如何编写WAV文件从Java中的字节数组开始?

谢谢.

推荐答案

已经有一段时间了,但是我认为这可能会对某人有所帮助.这是我的解决方案-我正在将字节写回到任何输出流(在我的情况下是servletoutputstream).首先,我写入WAV标头(44字节)以输出流并写入pcm字节(您需要将pcm数据转换为字节数组).我在html中使用了音频标签,并指定了src标签作为我的api网址,并且效果很好.

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). First, I write WAV header(44 bytes) to output stream and write the pcm bytes (You need to convert pcm data to byte array). I used audio tag in html and specified src tag as my api url and it worked perfectly fine.

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; } }

更多推荐

将PCM原始字节转换为WAV字节

本文发布于:2023-10-24 09:21:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1523562.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字节   转换为   原始   PCM   WAV

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!