我们可以使用unity自带的MicroPhone类来录音,回放录音,保存录音
具体代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;public class MicroPhoneManager : MonoBehaviour {public int DeviceLength;/// <summary>/// 录音频率/// </summary>public string Frequency = "44100";public int Samplerate = 44100;/// <summary>/// 录音时长/// </summary>public int MicSecond = 2;string infoLog = "";AudioSource _curAudioSource;AudioSource CurAudioSource{get{if (_curAudioSource == null){_curAudioSource = gameObject.AddComponent<AudioSource>();}return _curAudioSource;}}#region [public Way]/// <summary>/// 获取麦克风设备/// </summary>public void GetMicrophoneDevice(){string[] mDevice = Microphone.devices;DeviceLength = mDevice.Length;if (DeviceLength == 0)ShowInfoLog("找不到麦克风设备!");}/// <summary>/// 开始录音/// </summary>public void StartRecordAudio(){CurAudioSource.Stop();CurAudioSource.loop = false;CurAudioSource.mute = true;CurAudioSource.clip = Microphone.Start(null, true, MicSecond, int.Parse(Frequency));while (!(Microphone.GetPosition(null) > 0)){}CurAudioSource.Play();ShowInfoLog("开始录音.....");}/// <summary>/// 停止录音/// </summary>public void StopRecordAudio(){ShowInfoLog("结束录音.....");if (!Microphone.IsRecording(null))return;Microphone.End(null);CurAudioSource.Stop();}/// <summary>s/// 回放录音/// </summary>public void PlayRecordAudio(){if (Microphone.IsRecording(null))return;if (CurAudioSource.clip == null)return;CurAudioSource.mute = false;CurAudioSource.loop = false;CurAudioSource.Play();ShowInfoLog("播放录音.....");}/// <summary>///  打印录音信息/// </summary>public void PrintRecordData(){if (Microphone.IsRecording(null))return;byte[] data = GetClipData();#region 用户自由固定录音时长int position = Microphone.GetPosition(null);var soundata = new float[CurAudioSource.clip.samples * CurAudioSource.clip.channels];CurAudioSource.clip.GetData(soundata, 0);var newdata = new float[position * CurAudioSource.clip.channels];for (int i = 0; i < newdata.Length; i++) {newdata[i] = soundata[i];}CurAudioSource.clip = AudioClip.Create(CurAudioSource.clip.name, position, CurAudioSource.clip.channels, CurAudioSource.clip.frequency, false);CurAudioSource.clip.SetData(newdata, 0);Microphone.End(null);#endregionusing (FileStream fs = CreateEmpty(Application.persistentDataPath + "/dd.wav")) {ConvertAndWrite(fs, CurAudioSource.clip);WriteHeader(fs, CurAudioSource.clip);}string infoLog = "total length:" + data.Length + " time:" + CurAudioSource.time;ShowInfoLog(infoLog);}private 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);}private 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 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);}/// <summary>/// 获取音频数据/// </summary>/// <returns>The clip data.</returns>public byte[] GetClipData(){if (CurAudioSource.clip == null){ShowInfoLog("缺少音频资源!");return null;}float[] samples = new float[CurAudioSource.clip.samples];CurAudioSource.clip.GetData(samples, 0);byte[] outData = new byte[samples.Length * 2];int reScaleFactor = 32767;for (int i = 0; i < samples.Length; i++){short tempShort = (short)(samples[i] * reScaleFactor);byte[] tempData = System.BitConverter.GetBytes(tempShort);outData[i * 2] = tempData[0];outData[i * 2 + 1] = tempData[1];}if (outData == null || outData.Length <= 0){ShowInfoLog("获取音频数据失败!");return null;}return outData;}#endregionvoid OnGUI(){if (DeviceLength == 0){if (ShowGUIButton("获取麦克风设备")){GetMicrophoneDevice();}}else if (DeviceLength > 0){GUILayout.Label("录音频率:");Frequency = GUILayout.TextField(Frequency, GUILayout.Width(Screen.width / 5), GUILayout.Height(Screen.height / 20));GUILayout.BeginVertical();if (ShowGUIButton("开始录音")){StartRecordAudio();}if (ShowGUIButton("结束录音")){StopRecordAudio();}if (ShowGUIButton("回放录音")){PlayRecordAudio();}if (ShowGUIButton("获取录音数据")){PrintRecordData();}GUILayout.EndVertical();}GUILayout.Label(infoLog);}#region [Private Way]/// <summary>/// 显示GUI 按钮/// </summary>/// <returns><c>true</c>, if GUI button was shown, <c>false</c> otherwise.</returns>/// <param name="buttonName">Button name.</param>bool ShowGUIButton(string buttonName){return GUILayout.Button(buttonName, GUILayout.Height(Screen.height / 20), GUILayout.Width(Screen.width / 5));}void ShowInfoLog(string info){infoLog += info;infoLog += "\r\n";}#endregion
}

unity 录音并保存本地相关推荐

  1. Unity录音并且保存文件(去掉录音无效片段)

    将以下代码复制,挂在场景中(也可以将此脚本写成不继承mono的单例) 开始录音方法StartRecord. 停止录音方法StopRecord,参数为要保存的文件名,这里将文件保存到Applicatio ...

  2. Unity录音并保存成wav文件或者byte[]字节数组

    需要去商店下载[Open WAV Parser]这个插件,目前是免费的! ps. 用这个插件之前,用Unity原生的Microphone折腾了快两天.最终觉得还是这个插件好用啊!推荐!

  3. unity录音获取真实音频大小并获取字节流保存录音文件

    unity录音长度时提前设置的并且结束录音后大文件大小也是预设大小,保存文件的话就会有许多无效字节,这里提供一种方法截取真正的AudioClip大小.需要注意的是先调用获取真实大小录音的方法再调用 M ...

  4. iOS15仿微信详情二维码支持保存本地相册

    iOS15仿微信详情二维码支持保存本地相册 具体实现步骤请在b站搜索上面标题

  5. JSjavascript获取B站bilibili哔哩哔哩分P播放列表并以excel文件保存本地

    目录 获取分P播放列表(不下载) 获取分P播放列表(并将列表保存本地 excel 文件) 获取分P播放列表(并将列表保存本地图片文件) 参考网站 需要处理的页面按F12,出现控制台/console,粘 ...

  6. 微信小程序实现生成海报并且保存本地

    首先使用微信小程序提供的canvasapi将第二张图显示的海报画出来 然后调用保存本地的接口 wx.saveImageToPhotosAlbum({})将图片保存在本地相册中 首先我们需要在页面上创建 ...

  7. 微信小程序纯前端生成海报并保存本地

    需求 公司开发微信小程序,有一个海报页面,需要用户点击生成海报,可以将该该swipe-item 生成一个带二维码的图片,最终由纯前端实现! 技术调研 因为小程序的打包限制,不可能将所有的图片都放在代码 ...

  8. python scrapy框架 抓取的图片路径打不开图片_Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码...

    大家可以在Github上clone全部源码. 基本上按照文档的流程走一遍就基本会用了. Step1: 在开始爬取之前,必须创建一个新的Scrapy项目. 进入打算存储代码的目录中,运行下列命令: sc ...

  9. unity下载模型到本地并加载

    目录 1.目的 2.参考 2.1 Unity3D 动态加载本地/网络GLB模型 2.2 unity下载模型到本地并加载 2.3 插件:TriLib2.0 3.注意 4.操作 4.1 3dmax简单的制 ...

最新文章

  1. 微信小程序下拉刷新和上拉加载的实现
  2. 移动端点击事件延迟300毫秒
  3. 文巾解题 704. 二分查找
  4. 通过自动缩放Kinesis流实时传输数据
  5. 学弟学妹们,C#为啥学不好?是因为你没真正理解面向对象的思想!
  6. vim函数跳转 php,求助!! vim-gvim中如何让其显示函数及其参数!!
  7. The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
  8. 自动爬取中国大学mooc的pdf文档
  9. python从菜鸟到高手 pdf 百度云_Python从菜鸟到高手(4):导入Python模块
  10. 用python求期望_用Python计算明日方舟2021龙门幸运墙期望
  11. 安装scrapy报错
  12. 干货 | Github标星近3w,热榜第一,如何用Python实现所有算法和一些神经网络模型...
  13. Zabbix篇四:钉钉机器人报警
  14. 计算机试图启动宏,打开电子表格时,将提示禁用或启用宏的解决方案
  15. 计算机专业毕业后大致的工作方向
  16. layui追加或动态修改表单元素不生效
  17. 【基于动态内存+文件操作】通讯录管理系统
  18. 多益网络2015校园招聘面试题目大揭秘
  19. IDM关于某些应用程序阻止了IDM集成到浏览器中
  20. Mantis 安装与配置

热门文章

  1. linux安装gpfs系统要求,安装 GPFS 及配置准备
  2. 名家丨 顾险峰:当深度学习遇到3D
  3. 选修课:唐宋词鉴赏课堂笔记04
  4. python手册 apk_python apk签名
  5. bistuacm 2019年第六场新生训练赛题解
  6. 云南计算机专业本科学校,云南七成高校开设计算机专业 就业形势不容乐观
  7. 基于Socket通信的Android聊天室
  8. Nginx真的消除了惊群效应么?不
  9. 记第一次使用tiptap踩的坑
  10. 金万维动态域名小助手使用教程