https://gist.github.com/darktable/2317063

似乎需要超能力才能看到,所以复制粘贴一份过来。

  1 using System;
  2 using System.IO;
  3 using UnityEngine;
  4 using System.Collections.Generic;
  5 using System.Threading;
  6
  7 public class SavWav {
  8
  9     const int HEADER_SIZE = 44;
 10     struct ClipData{
 11
 12         public  int samples;
 13         public  int channels;
 14         public float[] samplesData;
 15
 16     }
 17
 18     public bool Save(string filename, AudioClip clip) {
 19         if (!filename.ToLower().EndsWith(".wav")) {
 20             filename += ".wav";
 21         }
 22
 23         var filepath = filename;
 24
 25         Debug.Log(filepath);
 26
 27         // Make sure directory exists if user is saving to sub dir.
 28         Directory.CreateDirectory(Path.GetDirectoryName(filepath));
 29         ClipData clipdata = new ClipData ();
 30         clipdata.samples = clip.samples;
 31         clipdata.channels = clip.channels;
 32         float[] dataFloat = new float[clip.samples*clip.channels];
 33         clip.GetData (dataFloat, 0);
 34         clipdata.samplesData = dataFloat;
 35         using (var fileStream = CreateEmpty(filepath)) {
 36             MemoryStream memstrm = new MemoryStream ();
 37             ConvertAndWrite(memstrm, clipdata);
 38             memstrm.WriteTo (fileStream);
 39             WriteHeader(fileStream, clip);
 40         }
 41
 42         return true; // TODO: return false if there's a failure saving the file
 43     }
 44
 45     public AudioClip TrimSilence(AudioClip clip, float min) {
 46         var samples = new float[clip.samples];
 47
 48         clip.GetData(samples, 0);
 49
 50         return TrimSilence(new List<float>(samples), min, clip.channels, clip.frequency);
 51     }
 52
 53     public AudioClip TrimSilence(List<float> samples, float min, int channels, int hz) {
 54         return TrimSilence(samples, min, channels, hz, false, false);
 55     }
 56
 57     public AudioClip TrimSilence(List<float> samples, float min, int channels, int hz, bool _3D, bool stream) {
 58         int i;
 59
 60         for (i=0; i<samples.Count; i++) {
 61             if (Mathf.Abs(samples[i]) > min) {
 62                 break;
 63             }
 64         }
 65
 66         samples.RemoveRange(0, i);
 67
 68         for (i=samples.Count - 1; i>0; i--) {
 69             if (Mathf.Abs(samples[i]) > min) {
 70                 break;
 71             }
 72         }
 73
 74         samples.RemoveRange(i, samples.Count - i);
 75
 76         var clip = AudioClip.Create("TempClip", samples.Count, channels, hz, _3D, stream);
 77
 78         clip.SetData(samples.ToArray(), 0);
 79
 80         return clip;
 81     }
 82
 83      FileStream CreateEmpty(string filepath) {
 84         var fileStream = new FileStream(filepath, FileMode.Create);
 85         byte emptyByte = new byte();
 86
 87         for(int i = 0; i < HEADER_SIZE; i++) //preparing the header
 88         {
 89             fileStream.WriteByte(emptyByte);
 90         }
 91
 92         return fileStream;
 93     }
 94
 95     void ConvertAndWrite(MemoryStream memStream, ClipData clipData)
 96     {
 97         float[] samples = new float[clipData.samples*clipData.channels];
 98
 99         samples = clipData.samplesData;
100
101         Int16[] intData = new Int16[samples.Length];
102
103         Byte[] bytesData = new Byte[samples.Length * 2];
104
105         const float rescaleFactor = 32767; //to convert float to Int16
106
107         for (int i = 0; i < samples.Length; i++)
108         {
109             intData[i] = (short)(samples[i] * rescaleFactor);
110             //Debug.Log (samples [i]);
111         }
112         Buffer.BlockCopy(intData, 0, bytesData, 0, bytesData.Length);
113         memStream.Write(bytesData, 0, bytesData.Length);
114     }
115
116      void WriteHeader(FileStream fileStream, AudioClip clip) {
117
118         var hz = clip.frequency;
119         var channels = clip.channels;
120         var samples = clip.samples;
121
122         fileStream.Seek(0, SeekOrigin.Begin);
123
124         Byte[] riff = System.Text.Encoding.UTF8.GetBytes("RIFF");
125         fileStream.Write(riff, 0, 4);
126
127         Byte[] chunkSize = BitConverter.GetBytes(fileStream.Length - 8);
128         fileStream.Write(chunkSize, 0, 4);
129
130         Byte[] wave = System.Text.Encoding.UTF8.GetBytes("WAVE");
131         fileStream.Write(wave, 0, 4);
132
133         Byte[] fmt = System.Text.Encoding.UTF8.GetBytes("fmt ");
134         fileStream.Write(fmt, 0, 4);
135
136         Byte[] subChunk1 = BitConverter.GetBytes(16);
137         fileStream.Write(subChunk1, 0, 4);
138
139         UInt16 two = 2;
140         UInt16 one = 1;
141
142         Byte[] audioFormat = BitConverter.GetBytes(one);
143         fileStream.Write(audioFormat, 0, 2);
144
145         Byte[] numChannels = BitConverter.GetBytes(channels);
146         fileStream.Write(numChannels, 0, 2);
147
148         Byte[] sampleRate = BitConverter.GetBytes(hz);
149         fileStream.Write(sampleRate, 0, 4);
150
151         Byte[] byteRate = BitConverter.GetBytes(hz * channels * 2); // sampleRate * bytesPerSample*number of channels, here 44100*2*2
152         fileStream.Write(byteRate, 0, 4);
153
154         UInt16 blockAlign = (ushort) (channels * 2);
155         fileStream.Write(BitConverter.GetBytes(blockAlign), 0, 2);
156
157         UInt16 bps = 16;
158         Byte[] bitsPerSample = BitConverter.GetBytes(bps);
159         fileStream.Write(bitsPerSample, 0, 2);
160
161         Byte[] datastring = System.Text.Encoding.UTF8.GetBytes("data");
162         fileStream.Write(datastring, 0, 4);
163
164         Byte[] subChunk2 = BitConverter.GetBytes(samples * channels * 2);
165         fileStream.Write(subChunk2, 0, 4);
166
167 //        fileStream.Close();
168     }
169 }

转载于:https://www.cnblogs.com/kileyi/p/11021262.html

Unity3D中把AudioClip保存为Wav文件相关推荐

  1. 安卓Android开发:使用AudioRecord录音、将录音保存为wav文件、使用AudioTrack保存录音

    一.使用AudioRrecord录音 1.1声明 首先需要声明一个AudioRecord类的实例.之所以需要事先声明,是因为在本例中,录音的启动和结束被封装在两个不同的方法里.而通常来讲," ...

  2. 用python实现语音的分割并保存为.wav文件

    功能描述   因为在研究使用openSMILE提取特征时,需要对语音进行分割,我找了很多方法,都无法实现自己想要效果,语音自己实现了语音分割并保存的代码,我测试了一下,可以达到自己想要的结果,因此写一 ...

  3. Unity3d 提取mesh并保存成asset文件

    Unity3d 提取mesh并保存成asset文件 应用背景 下载链接 使用步骤 贴出脚本 应用背景 有些FBX文件过大,但是只用其中的一个mesh时,我们可以考虑把这个mesh单独提取出来保存问as ...

  4. Python音频处理:创建一个正弦波并保存为wav文件

    Python音频处理:创建一个正弦波并保存为wav文件 0. 预备知识 0.1 数字信号基础 0.2 声学概念基础 1. 创建一个正弦波 2. 保存为wav文件 0. 预备知识 0.1 数字信号基础 ...

  5. ffmpeg提取mp4文件中的音频,保存为wav文件

    如题,一个命令行即可: ffmpeg -i 123.mp4 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 -f wav 123.wav 这样就生成了一个wav文 ...

  6. 如何使用jlink从flash中读取数据保存为bin文件到本地

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/skdkjxy/article/deta ...

  7. 【Unity3D日常开发】Unity3D中打包WEBGL后读取本地文件数据

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  8. FFmpeg从视频中提取音频保存为mp3文件

    如何把视频文件中的音频数据提取出来,网络上有不少音频提取工具,但作为技术人员提到音视频处理,肯定会想到FFmpeg.本文介绍了如何基于FFmpeg从视频中提取音频,然后将音频保存为mp3格式的音频文件 ...

  9. 将jmeter响应结果中部分数据保存到本地文件

    以登录接口为例,将jmeter响应结果中的data中的username字段的值,导出到本地文件,文件格式可以是.csv,txt 等等: 1.建一个登录接口的线程组: 1)新增一个--HTTP信息头管理 ...

  10. VS Code中如何关闭保存Go语言文件时自动去除未引用包的行为

    在使用Visual Studio Code编写Go语言(Golang)程序代码的时候,有时候引用的包明明是正确引用了,但在保存的时候却会被自动删除掉,是被误认为未引用了.这时候,参照以下步骤就可以解决 ...

最新文章

  1. 百万级访问量网站的技术准备工作[转帖]
  2. DCMTK:将DICOM文件的内容转换为JSON格式
  3. awk 实例练习 (三)
  4. 【转】4.1触碰jQuery:AJAX异步详解
  5. 如何制作印章_用Word也能做出逼真的电子印章!简单3步!1分钟搞定
  6. java aes解密算法_使用java实现AES算法的加解密(亲测可用)
  7. Python 变量赋值
  8. 让hover效果平滑过渡回初始状态?
  9. linux思考与实验答案,linux课后习题答案教材课后习题参考答案
  10. springboot修改项目不需要重启服务器
  11. kafka+多线程实现案例+Callable
  12. android idle模式
  13. 判断客户端是手机端还是PC端
  14. wpa_supplicant2.9编译过程
  15. python的词性标注
  16. 【单镜头反光相机】弥散圆、焦平面、景深、光圈
  17. 什么是搜索引擎优化(SEO)
  18. 手机里舍不得删除的48条搞笑短信
  19. 关于龙蜥社区20个问题 |龙蜥问答第1期
  20. 计算机维护与维修方法,浅谈计算机维护与维修方法

热门文章

  1. Redis开发运维实践上线部署规划之内存规划
  2. Changing the IP Address of a Domain Controller
  3. OpenGL学习(二)用户与交互
  4. 9.2 配置rsync+inotify实时同步
  5. 运输层_TCP可靠传输的实现
  6. 【代码保留】IP地址排序(字符串分隔补齐)
  7. php5.4安装教程,centos php 5.4 安装教程
  8. mysql 5.5 innodb 优化_mysql 5.5 -- innodb buffer pool优化
  9. SRv6技术课堂:SRv6可靠性方案(一)
  10. TC中的HTB队列简单创建与过滤