Guest User

Untitled

a guest
Aug 11th, 2024
1,030
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.32 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using UnityEngine;
  5. using System;
  6.  
  7. public static class WavUtility
  8. {
  9. const int HEADER_SIZE = 44;
  10.  
  11. private static FileStream CreateEmpty(string filePath)
  12. {
  13. FileStream fileStream = new FileStream(filePath, FileMode.Create);
  14. byte emptyByte = new byte();
  15. for (int i = 0; i < HEADER_SIZE; i++)
  16. {
  17. fileStream.WriteByte(emptyByte);
  18. }
  19. return fileStream;
  20. }
  21.  
  22. public static void Save(string filePath, AudioClip clip)
  23. {
  24. if (!filePath.ToLower().EndsWith(".wav"))
  25. {
  26. filePath += ".wav";
  27. }
  28.  
  29. Directory.CreateDirectory(Path.GetDirectoryName(filePath));
  30.  
  31. using (FileStream fileStream = CreateEmpty(filePath))
  32. {
  33. ConvertAndWrite(fileStream, clip);
  34. WriteHeader(fileStream, clip);
  35. }
  36. }
  37.  
  38. private static void ConvertAndWrite(FileStream fileStream, AudioClip clip)
  39. {
  40. float[] samples = new float[clip.samples];
  41.  
  42. clip.GetData(samples, 0);
  43.  
  44. Int16[] intData = new Int16[samples.Length];
  45. Byte[] bytesData = new Byte[samples.Length * 2];
  46.  
  47. const float rescaleFactor = 32767;
  48. for (int i = 0; i < samples.Length; i++)
  49. {
  50. intData[i] = (short)(samples[i] * rescaleFactor);
  51. Byte[] byteArr = new Byte[2];
  52. byteArr = BitConverter.GetBytes(intData[i]);
  53. byteArr.CopyTo(bytesData, i * 2);
  54. }
  55.  
  56. fileStream.Write(bytesData, 0, bytesData.Length);
  57. }
  58.  
  59. private static void WriteHeader(FileStream fileStream, AudioClip clip)
  60. {
  61. int hz = clip.frequency;
  62. int channels = clip.channels;
  63. int samples = clip.samples;
  64.  
  65. fileStream.Seek(0, SeekOrigin.Begin);
  66.  
  67. Byte[] riff = System.Text.Encoding.UTF8.GetBytes("RIFF");
  68. fileStream.Write(riff, 0, 4);
  69.  
  70. Byte[] chunkSize = BitConverter.GetBytes(fileStream.Length - 8);
  71. fileStream.Write(chunkSize, 0, 4);
  72.  
  73. Byte[] wave = System.Text.Encoding.UTF8.GetBytes("WAVE");
  74. fileStream.Write(wave, 0, 4);
  75.  
  76. Byte[] fmt = System.Text.Encoding.UTF8.GetBytes("fmt ");
  77. fileStream.Write(fmt, 0, 4);
  78.  
  79. Byte[] subChunk1 = BitConverter.GetBytes(16);
  80. fileStream.Write(subChunk1, 0, 4);
  81.  
  82. UInt16 one = 1;
  83.  
  84. Byte[] audioFormat = BitConverter.GetBytes(one);
  85. fileStream.Write(audioFormat, 0, 2);
  86.  
  87. Byte[] numChannels = BitConverter.GetBytes(channels);
  88. fileStream.Write(numChannels, 0, 2);
  89.  
  90. Byte[] sampleRate = BitConverter.GetBytes(hz);
  91. fileStream.Write(sampleRate, 0, 4);
  92.  
  93. Byte[] byteRate = BitConverter.GetBytes(hz * channels * 2);
  94. fileStream.Write(byteRate, 0, 4);
  95.  
  96. UInt16 blockAlign = (ushort)(channels * 2);
  97. fileStream.Write(BitConverter.GetBytes(blockAlign), 0, 2);
  98.  
  99. UInt16 bps = 16;
  100. Byte[] bitsPerSample = BitConverter.GetBytes(bps);
  101. fileStream.Write(bitsPerSample, 0, 2);
  102.  
  103. Byte[] datastring = System.Text.Encoding.UTF8.GetBytes("data");
  104. fileStream.Write(datastring, 0, 4);
  105.  
  106. Byte[] subChunk2 = BitConverter.GetBytes(samples * channels * 2);
  107. fileStream.Write(subChunk2, 0, 4);
  108.  
  109. }
  110.  
  111. }
  112.  
Advertisement
Add Comment
Please, Sign In to add comment