unity wav 格式音频转 写入本地
2017-04-19 20:23
519 查看
public static void Save(AudioClip clip, string path) { string filePath = Path.GetDirectoryName(path); if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } using (FileStream fileStream = CreateEmpty(path)) { ConvertAndWrite(fileStream, clip); WriteHeader(fileStream, clip); } } private static void ConvertAndWrite(FileStream fileStream, AudioClip clip) { float[] samples = new float[clip.samples]; clip.GetData(samples, 0); Int16[] intData = new Int16[samples.Length]; Byte[] bytesData = new Byte[samples.Length * 2]; int rescaleFactor = 32767; //to convert float to Int16 for (int i = 0; i < samples.Length; i++) { intData[i] = (short)(samples[i] * rescaleFactor); Byte[] byteArr = new Byte[2]; byteArr = BitConverter.GetBytes(intData[i]); byteArr.CopyTo(bytesData, i * 2); } fileStream.Write(bytesData, 0, bytesData.Length); } private static FileStream CreateEmpty(string filepath) { FileStream fileStream = new FileStream(filepath, FileMode.Create); byte emptyByte = new byte(); for (int i = 0; i < 44; i++) //preparing the header { fileStream.WriteByte(emptyByte); } return fileStream; } private static void WriteHeader(FileStream stream, AudioClip clip) { int hz = clip.frequency; int channels = clip.channels; int samples = clip.samples; stream.Seek(0, SeekOrigin.Begin); Byte[] riff = System.Text.Encoding.UTF8.GetBytes("RIFF"); stream.Write(riff, 0, 4); Byte[] chunkSize = BitConverter.GetBytes(stream.Length - 8); stream.Write(chunkSize, 0, 4); Byte[] wave = System.Text.Encoding.UTF8.GetBytes("WAVE"); stream.Write(wave, 0, 4); Byte[] fmt = System.Text.Encoding.UTF8.GetBytes("fmt "); stream.Write(fmt, 0, 4); Byte[] subChunk1 = BitConverter.GetBytes(16); stream.Write(subChunk1, 0, 4); UInt16 two = 2; UInt16 one = 1; Byte[] audioFormat = BitConverter.GetBytes(one); stream.Write(audioFormat, 0, 2); Byte[] numChannels = BitConverter.GetBytes(channels); stream.Write(numChannels, 0, 2); Byte[] sampleRate = BitConverter.GetBytes(hz); stream.Write(sampleRate, 0, 4); Byte[] byteRate = BitConverter.GetBytes(hz * channels * 2); // sampleRate * bytesPerSample*number of channels, here 44100*2*2 stream.Write(byteRate, 0, 4); UInt16 blockAlign = (ushort)(channels * 2); stream.Write(BitConverter.GetBytes(blockAlign), 0, 2); UInt16 bps = 16; Byte[] bitsPerSample = BitConverter.GetBytes(bps); stream.Write(bitsPerSample, 0, 2); Byte[] datastring = System.Text.Encoding.UTF8.GetBytes("data"); stream.Write(datastring, 0, 4); Byte[] subChunk2 = BitConverter.GetBytes(samples * channels * 2); stream.Write(subChunk2, 0, 4); }
相关文章推荐
- 解决本地wav或者其他格式音频不能播放的问题
- unity wav 格式音频转换为二进制文件
- Java实现音频格式转换 WAV---mp3,可使音频压缩
- 关于unity中支持的音频的格式和视频的格式的总结
- 音频编解码·格式篇(1)Wave PCM audio format(WAV)
- 多媒体音频格式解析WMA WAV OGG AAC APE FLAC
- wav音频文件格式分析
- wav音频文件格式解析
- Java实现音频格式转换 WAV---mp3,可使音频压缩
- 用 python 脚本,把当前目录及子目录下的 wav 音频文件转换为 flac 格式
- 多媒体音频格式解析WMA WAV OGG AAC APE FLAC[转载]
- WAV音频文件格式
- 基于STM32的WAV音频格式播放器
- Linux音频驱动-WAV文件格式分析
- javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)
- 播放所设置格式个音频文件,可播放MP3,asx,mpg,wav文件
- 流行音频格式说明:MP3,WMA,OGG,VQF,mp3PRO,AAC ,WAV,RA,APE及转换
- Unity把图片写入本地和读取本地图片
- iOS音频格式之AMR和WAV互转(更新支持64位)