U3D录音以及保存为wav格式文件
来源:互联网 发布:2017网络融资骗局大全 编辑:程序博客网 时间:2024/05/16 08:47
Hello,我是KitStar
还是直接上代码:试着去理解会学到更多。代码完全正确,经过多次测试。
using UnityEngine;using System.IO;using System;using UnityEngine.UI;[RequireComponent(typeof(AudioSource))]public class RecordingWav : MonoBehaviour { public Image imageButton; string filePath = null; private AudioSource m_audioSource; private AudioClip m_audioClip; public const int SamplingRate = 8000; private const int HEADER_SIZE = 44; public bool isRecording = false; public Byte[] speech_Byte; // Use this for initialization void Start () { m_audioSource = GetComponent<AudioSource>(); filePath = Application.dataPath + "/StreamingAssets/"; }// Update is called once per framevoid Update () {} public void StartRecording() { isRecording = !isRecording; if (isRecording) { Microphone.End(null); foreach (string d in Microphone.devices) { Debug.Log("Devid :" + d); } m_audioClip = Microphone.Start(null, false, 60, SamplingRate); imageButton.color = Color.red; } else { imageButton.color = Color.blue; int audioLength = 0; int lastPos = Microphone.GetPosition(null); if (Microphone.IsRecording(null)) { audioLength = lastPos / SamplingRate; } else { audioLength = 1; Debug.Log("error : 录音时间太短"); } Microphone.End(null); if (audioLength <= 1.0f) return; bool Res = SaveWav("Microphone", m_audioClip); } } public void PlayAudioClip() { if(m_audioClip.length > 5 && m_audioClip != null) { if(m_audioSource.isPlaying) { m_audioSource.Stop(); } Debug.Log("Channel :" + m_audioClip.channels + " ;Samle :" + m_audioClip.samples + " ;frequency :" + m_audioClip.frequency + " ;length :" + m_audioClip.length); m_audioSource.clip = m_audioClip; m_audioSource.Play(); } } bool SaveWav(string filename, AudioClip clip) { try { if (!filename.ToLower().EndsWith(".wav")) { filename += ".wav"; } filePath = filePath + filename; Debug.Log("Record Ok :" + filePath); Directory.CreateDirectory(Path.GetDirectoryName(filePath)); using (FileStream fileStream = CreateEmpty(filePath)) { ConvertAndWrite(fileStream, clip); } return true; } catch(Exception ex) { Debug.Log("error : " + ex); return false; } } FileStream CreateEmpty(string filePath) { FileStream fileStream = new FileStream(filePath,FileMode.Create); byte emptyByte = new byte(); for(int i = 0; i < HEADER_SIZE; i++) { fileStream.WriteByte(emptyByte); } return fileStream; } 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); } speech_Byte = bytesData; fileStream.Write(bytesData, 0, bytesData.Length); WriteHeader(fileStream, clip); } void WriteHeader(FileStream fileStream, AudioClip clip) { int hz = clip.frequency; int channels = clip.channels; int samples = clip.samples; fileStream.Seek(0, SeekOrigin.Begin); Byte[] riff = System.Text.Encoding.UTF8.GetBytes("RIFF"); fileStream.Write(riff, 0, 4); Byte[] chunkSize = BitConverter.GetBytes(fileStream.Length - 8); fileStream.Write(chunkSize, 0, 4); Byte[] wave = System.Text.Encoding.UTF8.GetBytes("WAVE"); fileStream.Write(wave, 0, 4); Byte[] fmt = System.Text.Encoding.UTF8.GetBytes("fmt "); fileStream.Write(fmt, 0, 4); Byte[] subChunk1 = BitConverter.GetBytes(16); fileStream.Write(subChunk1, 0, 4); UInt16 two = 2; UInt16 one = 1; Byte[] audioFormat = BitConverter.GetBytes(one); fileStream.Write(audioFormat, 0, 2); Byte[] numChannels = BitConverter.GetBytes(channels); fileStream.Write(numChannels, 0, 2); Byte[] sampleRate = BitConverter.GetBytes(hz); fileStream.Write(sampleRate, 0, 4); Byte[] byteRate = BitConverter.GetBytes(hz * channels * 2); // sampleRate * bytesPerSample*number of channels, here 44100*2*2 fileStream.Write(byteRate, 0, 4); UInt16 blockAlign = (ushort)(channels * 2); fileStream.Write(BitConverter.GetBytes(blockAlign), 0, 2); UInt16 bps = 16; Byte[] bitsPerSample = BitConverter.GetBytes(bps); fileStream.Write(bitsPerSample, 0, 2); Byte[] datastring = System.Text.Encoding.UTF8.GetBytes("data"); fileStream.Write(datastring, 0, 4); Byte[] subChunk2 = BitConverter.GetBytes(samples * 2 * channels); fileStream.Write(subChunk2, 0, 4); fileStream.Close(); Debug.Log(" OK "); } }
阅读全文
1 0
- U3D录音以及保存为wav格式文件
- 【Unity】Unity Microphone录音 保存wav 功能
- STM32--vs1053 WAV录音实现(wav保存在flash)
- u3d保存RenderTexture为Png
- PCM格式保存为wav
- WP7录音-IsolatedStorage保存wav文件-IsolatedStorage上传wav录音文件(完整版)
- STM32--vs1053 WAV录音实现(保存在SD卡)
- 讯飞录音,把几个pcm合成为wav
- "画图"不能保存为JPG格式文件
- JAVA 播放WAV格式文件
- 封装成wav格式文件
- 【音频】Wav格式文件详解
- Python--读取wav格式文件
- Python--生成Wav格式文件
- WAV格式文件分析
- WAV格式文件学习
- Mediarecorder录音(保存为本地文件AAC格式)
- Android录音、WAV、AMR
- 114. Flatten Binary Tree to Linked List
- 【Tomcat9源码分析】源码下载、编译与调试
- MVC中的service层是干嘛的?
- Linux gdb debug 常用命令
- Qt设计滑动条
- U3D录音以及保存为wav格式文件
- T
- 判断元素出栈合法性
- 【C++】String类拷贝构造函数——浅拷贝优化的三种方式(引用计数)
- dwt和wavedec区别
- linux下安装配置mysql
- JDBC编程--完成用户注册功能
- (LeetCode) 343. Integer Break
- Maven学习笔记