数据格式

[0.0, -0.0, -0.0, 0.0, 0.0, 0.0, 5.960464477539063e-08, 5.960464477539063e-08, 1.1920928955078125e-07, 1.7881393432617188e-07, 2.384185791015625e-07,.....]

转换方法:c#

  1. using System;
  2. using System.IO;
  3. using System.Text;
  4.  
  5. namespace deserialfromPCMData
  6. {
  7. public static class BinaryWriterExtensions
  8. {
  9. private const int HeaderSize = ;
  10.  
  11. private const int Hz = ; //frequency or sampling rate
  12.  
  13. private const float RescaleFactor = ; //to convert float to Int16
  14.  
  15. public static void AppendWaveData<T>(this T stream, float[] buffer)
  16. where T : Stream
  17. {
  18. if (stream.Length > HeaderSize)
  19. {
  20. stream.Seek(, SeekOrigin.End);
  21. }
  22. else
  23. {
  24. stream.SetLength(HeaderSize);
  25. stream.Position = HeaderSize;
  26. }
  27.  
  28. // rescale
  29. var floats = Array.ConvertAll(buffer, x => (short)(x * RescaleFactor));
  30.  
  31. // Copy to bytes
  32. var result = new byte[floats.Length * sizeof(short)];
  33. Buffer.BlockCopy(floats, , result, , result.Length);
  34.  
  35. // write to stream
  36. stream.Write(result, , result.Length);
  37.  
  38. // Update Header
  39. UpdateHeader(stream);
  40. }
  41.  
  42. public static void UpdateHeader(Stream stream)
  43. {
  44. var writer = new BinaryWriter(stream);
  45.  
  46. writer.Seek(, SeekOrigin.Begin);
  47.  
  48. writer.Write(Encoding.ASCII.GetBytes("RIFF")); //RIFF marker. Marks the file as a riff file. Characters are each 1 byte long.
  49. writer.Write((int)(writer.BaseStream.Length - )); //file-size (equals file-size - 8). Size of the overall file - 8 bytes, in bytes (32-bit integer). Typically, you'd fill this in after creation.
  50. writer.Write(Encoding.ASCII.GetBytes("WAVE")); //File Type Header. For our purposes, it always equals "WAVE".
  51. writer.Write(Encoding.ASCII.GetBytes("fmt ")); //Mark the format section. Format chunk marker. Includes trailing null.
  52. writer.Write(); //Length of format data. Always 16.
  53. writer.Write((short)); //Type of format (1 is PCM, other number means compression) . 2 byte integer. Wave type PCM
  54. writer.Write((short)); //Number of Channels - 2 byte integer
  55. writer.Write(Hz); //Sample Rate - 32 byte integer. Sample Rate = Number of Samples per second, or Hertz.
  56. writer.Write(Hz * * ); // sampleRate * bytesPerSample * number of channels, here 16000*2*1.
  57. writer.Write((short)( * )); //channels * bytesPerSample, here 1 * 2 // Bytes Per Sample: 1=8 bit Mono, 2 = 8 bit Stereo or 16 bit Mono, 4 = 16 bit Stereo
  58. writer.Write((short)); //Bits per sample (BitsPerSample * Channels) ?? should be 8???
  59. writer.Write(Encoding.ASCII.GetBytes("data")); //"data" chunk header. Marks the beginning of the data section.
  60. writer.Write((int)(writer.BaseStream.Length - HeaderSize)); //Size of the data section. data-size (equals file-size - 44). or NumSamples * NumChannels * bytesPerSample ??
  61. }
  62. } //end of class
  63. }
  1. using System;
  2. using System.IO;
  3. using System.Text;
  4.  
  5. namespace deserialfromPCMData
  6. {
  7. class SaveAudioStreamToWav
  8. {
  9. static void Main(string[] args)
  10. {
  11.  
  12. Stream instream = File.OpenRead(@"g:\sample.txt");
  13.  
  14. BufferedStream bfs = new BufferedStream(instream);
  15. byte[] array = new byte[bfs.Length];
  16. instream.Read(array, , array.Length);
  17.  
  18. string str = Encoding.Default.GetString(array);
  19.  
  20. var StreamSample = str.Substring(, str.Length - ).Split(',');
  21.  
  22. var floatsArray = new float[StreamSample.Length];
  23. floatsArray = Array.ConvertAll(StreamSample, x => (float)Convert.ToDouble(x));
  24.  
  25. using (var stream = new FileStream(@"g:\sample2.wav", FileMode.Create, FileAccess.ReadWrite))
  26. {
  27. stream.AppendWaveData(floatsArray);
  28. }
  29. }
  30. }
  31. }

Java方法:

  1. package com;
  2.  
  3. import com.sun.media.sound.WaveFileWriter;
  4. import org.junit.Test;
  5.  
  6. import javax.sound.sampled.AudioFileFormat;
  7. import javax.sound.sampled.AudioFormat;
  8. import javax.sound.sampled.AudioInputStream;
  9. import java.io.*;
  10. import java.util.Arrays;
  11.  
  12. //https://stackoverflow.com/questions/3599378/java-read-wav-file-as-a-float-array
  13. //
  14. //https://stackoverflow.com/questions/26824663/how-do-i-use-audio-sample-data-from-java-sound
  15. //
  16. //https://stackoverflow.com/questions/4440015/java-pcm-to-wav
  17. public class TestWavFile {
  18.  
  19. //采样率16kHz
  20. private float SAMPLING_RATE = 16000;
  21. private float sampleSizeBits = 16;
  22.  
  23. //把short(2字节)拆解成字节流byte[2]
  24. public byte[] get16BitPcm(short[] data) {
  25.  
  26. byte[] resultData = new byte[2 * data.length];
  27. int iter = 0;
  28. for (short sample : data) {
  29. resultData[iter++] = (byte)(sample & 0x00ff);
  30. resultData[iter++] = (byte)((sample & 0xff00) >>> 8);
  31. }
  32. return resultData;
  33. }
  34.  
  35. @Test
  36. public void test() throws IOException{
  37.  
  38. BufferedReader bufferedReader = new BufferedReader(
  39. new InputStreamReader(
  40. new FileInputStream("g:/sample.txt")));
  41.  
  42. StringBuffer buffer = new StringBuffer();
  43. String line = null;
  44.  
  45. while ( (line = bufferedReader.readLine()) != null)
  46. {
  47. buffer.append(line);
  48. }
  49.  
  50. int len = buffer.length();
  51.  
  52. String raw = buffer.substring(1,len-1);
  53.  
  54. Short[] data = Arrays.stream(raw.split(","))
  55. .map(track->( Float.valueOf(track) * 0x7fff ))
  56. .map(item->item.shortValue()).toArray(Short[]::new);
  57.  
  58. short [] frameData = new short[data.length];
  59.  
  60. for (int i = 0; i< data.length; i++) {
  61. frameData[i] = data[i];
  62. }
  63.  
  64. WaveFileWriter writer = new WaveFileWriter();
  65.  
  66. FileOutputStream outStream = new FileOutputStream("g:/sample.wav");
  67. //(采样率,比特位,通道,是否有符号,大小端)
  68. //比特位:short 2个字节 2*8 = 16
  69. //是否有符号:是否有负数
  70. //
  71. AudioFormat format = new AudioFormat(SAMPLING_RATE,16,1,true,false);
  72.  
  73. AudioInputStream audioInputStream = new AudioInputStream(new ByteArrayInputStream(get16BitPcm(frameData)), format, frameData.length);
  74.  
  75. writer.write(audioInputStream, AudioFileFormat.Type.WAVE, outStream);
  76.  
  77. }
  78. }

java封装工具:

  1. import com.fasterxml.jackson.databind.ObjectMapper;
  2. import com.sun.media.sound.WaveFileWriter;
  3. import lombok.Data;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.apache.commons.lang3.ArrayUtils;
  6.  
  7. import javax.sound.sampled.AudioFileFormat;
  8. import javax.sound.sampled.AudioFormat;
  9. import javax.sound.sampled.AudioInputStream;
  10. import java.io.ByteArrayInputStream;
  11. import java.io.FileOutputStream;
  12. import java.io.IOException;
  13. import java.nio.ByteBuffer;
  14. import java.util.Arrays;
  15.  
  16. @Slf4j
  17. public final class WavFileGenerator {
  18.  
  19. //采样率16kHz
  20. private float SAMPLING_RATE = 16000;
  21. private float sampleSizeBits = 16;
  22.  
  23. private int HeaderSize = 44;
  24.  
  25. //frequency or sampling rate
  26. private int Hz = 16_000;
  27.  
  28. private byte[] values;
  29.  
  30. public WavFileGenerator(String ctx)
  31. {
  32. this(convert(ctx));
  33. }
  34. public WavFileGenerator(String []values)
  35. {
  36. convert(toPrimitive(Arrays.asList(values).stream().map(Float::valueOf).toArray(size -> new Float[size])));
  37. }
  38.  
  39. public WavFileGenerator(short[] values)
  40. {
  41. /*sizeof(short) was 2 bytes in java platform*/
  42. byte[] result = new byte[values.length * 2];
  43.  
  44. // 1short = 2bytes
  45. int iter = 0;
  46. for (short sample : values) {
  47. result[iter++] = (byte)(sample & 0x00ff);
  48. result[iter++] = (byte)((sample & 0xff00) >>> 8);
  49. }
  50.  
  51. this.values = result;
  52. }
  53. public WavFileGenerator(float[] floatValues)
  54. {
  55. this(convert(floatValues));
  56. }
  57.  
  58. static float[] toPrimitive(Float[] floats)
  59. {
  60. return ArrayUtils.toPrimitive(floats);
  61. }
  62.  
  63. public static final short[] convert(float[] values)
  64. {
  65. //PCM 16bit little endian
  66. short[] shortValues = new short[values.length];
  67. for (int i = 0; i < values.length; i++) {
  68. float value = values[i];
  69. shortValues[i] = (short) (value < 0 ? value* 0x8000 : value*0x7fff);
  70. }
  71. return shortValues;
  72. }
  73.  
  74. public static final float[] convert(String ctx)
  75. {
  76. ObjectMapper objectMapper = new ObjectMapper();
  77. try {
  78. Float[] data = objectMapper.readValue(ctx, Float[].class);
  79. return toPrimitive(data);
  80. } catch (IOException e) {
  81. log.error("转换出错:{}",e);
  82. }
  83. return new float[0];
  84. }
  85.  
  86. public byte[] getFmtChunk()
  87. {
  88. return null;
  89. }
  90.  
  91. public byte[] getDataChunk()
  92. {
  93. return values;
  94. }
  95.  
  96. void builder()
  97. {
  98.  
  99. }
  100.  
  101. public ByteBuffer getAudioStream()
  102. {
  103. return null;
  104. }
  105.  
  106. public void saveFile(String dest) throws IOException {
  107.  
  108. WaveFileWriter writer = new WaveFileWriter();
  109. FileOutputStream outStream = new FileOutputStream(dest);
  110. AudioFormat format = new AudioFormat(SAMPLING_RATE,16,1,true,false);
  111. int frames = values.length / 2;
  112. AudioInputStream audioInputStream = new AudioInputStream(new ByteArrayInputStream(values), format, frames);
  113. writer.write(audioInputStream, AudioFileFormat.Type.WAVE, outStream);
  114. audioInputStream.close();
  115. outStream.close();
  116. }
  117. }

运行以上两个文件,最终会成功wav文件。

样本数据

WAV相关:从PCM16 Little Endian数据转WAV文件的更多相关文章

  1. 【应用】:shell crontab定时生成oracle表的数据到txt文件,并上传到ftp

    一.本人环境描述      1.oracle服务端装在win7 32位上,oracle版本为10.2.0.1.0      2.Linux为centos6.5 32位,安装在Oracle VM Vir ...

  2. HTML5操作麦克风获取音频数据(WAV)的一些基础技能

    基于HTML5的新特性,操作其实思路很简单. 首先通过navigator获取设备,然后通过设备监听语音数据,进行原始数据采集. 相关的案例比较多,最典型的就是链接:https://developer. ...

  3. pcm数据生成wav文件

    Qt由pcm数据生成wav文件 void AudioGrabber::saveWave(const QString &fileName, const QByteArray &raw, ...

  4. C#中使用WavHelper保存录音数据为wav文件

    C#将录音数据文件保存为wav格式文件,这里使用到的是WavHelper工具类. WavHelper工具类: using System; using System.Collections.Generi ...

  5. php添加数据到xml文件的例子

    php添加数据到xml文件中 时间:2015-12-17 06:30:37来源:网络 导读:php添加数据到xml文件中   xml文件:stu.xml: 复制代码代码如下: <?xml ver ...

  6. MYSQL数据库导入大数据量sql文件失败的解决方案

    1.在讨论这个问题之前首先介绍一下什么是"大数据量sql文件". 导出sql文件.选择数据库-----右击选择"转储SQL文件"-----选择"结构和 ...

  7. [大数据]-Fscrawler导入文件(txt,html,pdf,worf...)到Elasticsearch5.3.1并配置同义词过滤

    fscrawler是ES的一个文件导入插件,只需要简单的配置就可以实现将本地文件系统的文件导入到ES中进行检索,同时支持丰富的文件格式(txt.pdf,html,word...)等等.下面详细介绍下f ...

  8. Python:将爬取的网页数据写入Excel文件中

    Python:将爬取的网页数据写入Excel文件中 通过网络爬虫爬取信息后,我们一般是将内容存入txt文件或者数据库中,也可以写入Excel文件中,这里介绍关于使用Excel文件保存爬取到的网页数据的 ...

  9. 30G 上亿数据的超大文件,如何快速导入生产环境?

    Hello,大家好,我是楼下小黑哥~ 如果给你一个包含一亿行数据的超大文件,让你在一周之内将数据转化导入生产数据库,你会如何操作? 上面的问题其实是小黑哥前段时间接到一个真实的业务需求,将一个老系统历 ...

随机推荐

  1. JS+rem,移动端适配

    window.onresize = function () { setHtmlFz(); } setHtmlFz(); function setHtmlFz() { // 基础值 var baseVa ...

  2. 使用Optional优雅处理null

    先假设一个场景.如下所示 public class Person { private String name; public Person() { } public Person(String nam ...

  3. luogu T96516 [DBOI2019]持盾 可持久化线段树+查分

    因为题中的操作是区间加法,所以满足前缀相减性. 而每一次查询的时候还是单点查询,所以直接用可持久化线段树维护差分数组,然后查一个前缀和就行了. code: #include <bits/stdc ...

  4. Servlet实现注册

    1.Servlet实现注册的思路: 2.工程结构 3.功能实现: (1)html实现对数据的收集: <body bgcolor="aqua"> <center&g ...

  5. C# 异步编程(async&await)

    同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...

  6. PWM控制灯亮暗的verilog实现

    PWM的全称为Pulse-Width Modulation(脉冲宽度调制),即调节脉冲的占空比.当输出的脉冲频率一定时,输出的脉冲占空比越大,相当于输出的有效电平越大,这样也就简单实现了由FPGA来控 ...

  7. P5590 【赛车游戏】

    果然我还是太\(Naive\)了 首先有一些点/边其实是没有意义的,如果从1出发不能到该点或者从该点不能到n,这个点就可以不用管了.这个过程可以用正反两边\(dfs/bfs\)实现 然后删掉那些点之后 ...

  8. 【随记】Sql Server 2008 R2 备份时“无法打开备份设备”

    如下图所示,在执行SQL一个简单的备份命令时发生下面的错误 可能的原因: 1.文件夹权限问题: 2.Sql Server SQLServer服务器用户策略问题: 问题排查: 1.查看了temp文件夹, ...

  9. cropper手机使用实例

    cropper手机使用实例 一.总结 一句话总结: 启示:还是要多个相关的实例交叉使用,相互印证,查漏补缺,可以更加高效和方便和节约时间 二.Cropper.js从前台到后台的完整实例应用 转自或参考 ...

  10. [教程] Packt - Create a Game Environment with Blender and Unity by Darrin Lile

    学习了解如何使用Blender,photoshop和Unity创建自己的游戏环境!了解如何通过比以往更加集成的方式使用Blender和Unity,将自己的游戏设计变为现实.在Unity中创建测试版本 ...