Unity3D中把AudioClip保存为Wav文件
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文件相关推荐
- 安卓Android开发:使用AudioRecord录音、将录音保存为wav文件、使用AudioTrack保存录音
一.使用AudioRrecord录音 1.1声明 首先需要声明一个AudioRecord类的实例.之所以需要事先声明,是因为在本例中,录音的启动和结束被封装在两个不同的方法里.而通常来讲," ...
- 用python实现语音的分割并保存为.wav文件
功能描述 因为在研究使用openSMILE提取特征时,需要对语音进行分割,我找了很多方法,都无法实现自己想要效果,语音自己实现了语音分割并保存的代码,我测试了一下,可以达到自己想要的结果,因此写一 ...
- Unity3d 提取mesh并保存成asset文件
Unity3d 提取mesh并保存成asset文件 应用背景 下载链接 使用步骤 贴出脚本 应用背景 有些FBX文件过大,但是只用其中的一个mesh时,我们可以考虑把这个mesh单独提取出来保存问as ...
- Python音频处理:创建一个正弦波并保存为wav文件
Python音频处理:创建一个正弦波并保存为wav文件 0. 预备知识 0.1 数字信号基础 0.2 声学概念基础 1. 创建一个正弦波 2. 保存为wav文件 0. 预备知识 0.1 数字信号基础 ...
- ffmpeg提取mp4文件中的音频,保存为wav文件
如题,一个命令行即可: ffmpeg -i 123.mp4 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 -f wav 123.wav 这样就生成了一个wav文 ...
- 如何使用jlink从flash中读取数据保存为bin文件到本地
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/skdkjxy/article/deta ...
- 【Unity3D日常开发】Unity3D中打包WEBGL后读取本地文件数据
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...
- FFmpeg从视频中提取音频保存为mp3文件
如何把视频文件中的音频数据提取出来,网络上有不少音频提取工具,但作为技术人员提到音视频处理,肯定会想到FFmpeg.本文介绍了如何基于FFmpeg从视频中提取音频,然后将音频保存为mp3格式的音频文件 ...
- 将jmeter响应结果中部分数据保存到本地文件
以登录接口为例,将jmeter响应结果中的data中的username字段的值,导出到本地文件,文件格式可以是.csv,txt 等等: 1.建一个登录接口的线程组: 1)新增一个--HTTP信息头管理 ...
- VS Code中如何关闭保存Go语言文件时自动去除未引用包的行为
在使用Visual Studio Code编写Go语言(Golang)程序代码的时候,有时候引用的包明明是正确引用了,但在保存的时候却会被自动删除掉,是被误认为未引用了.这时候,参照以下步骤就可以解决 ...
最新文章
- 百万级访问量网站的技术准备工作[转帖]
- DCMTK:将DICOM文件的内容转换为JSON格式
- awk 实例练习 (三)
- 【转】4.1触碰jQuery:AJAX异步详解
- 如何制作印章_用Word也能做出逼真的电子印章!简单3步!1分钟搞定
- java aes解密算法_使用java实现AES算法的加解密(亲测可用)
- Python 变量赋值
- 让hover效果平滑过渡回初始状态?
- linux思考与实验答案,linux课后习题答案教材课后习题参考答案
- springboot修改项目不需要重启服务器
- kafka+多线程实现案例+Callable
- android idle模式
- 判断客户端是手机端还是PC端
- wpa_supplicant2.9编译过程
- python的词性标注
- 【单镜头反光相机】弥散圆、焦平面、景深、光圈
- 什么是搜索引擎优化(SEO)
- 手机里舍不得删除的48条搞笑短信
- 关于龙蜥社区20个问题 |龙蜥问答第1期
- 计算机维护与维修方法,浅谈计算机维护与维修方法
热门文章
- Redis开发运维实践上线部署规划之内存规划
- Changing the IP Address of a Domain Controller
- OpenGL学习(二)用户与交互
- 9.2 配置rsync+inotify实时同步
- 运输层_TCP可靠传输的实现
- 【代码保留】IP地址排序(字符串分隔补齐)
- php5.4安装教程,centos php 5.4 安装教程
- mysql 5.5 innodb 优化_mysql 5.5 -- innodb buffer pool优化
- SRv6技术课堂:SRv6可靠性方案(一)
- TC中的HTB队列简单创建与过滤