在场景中创建空节点并添加Audio Source组件。再为其挂载以下脚本,可轻松实现录音、播放和保存功能。可在PC和安卓移动端使用(iOS未作尝试)。

using UnityEngine;
using UnityEngine.UI;
using System;
using System.IO;public class TestMicro : MonoBehaviour
{private bool micConnected = false;//麦克风是否连接private int minFreq, maxFreq;//最小和最大频率public AudioClip RecordedClip;//录音public AudioSource audioSource;//播放的音频public Text Infotxt;//提示信息public Text Adress;//音频保存地址private string fileName;//保存的文件名private byte[] data;private void Start(){if (Microphone.devices.Length <= 0){Infotxt.text = "缺少麦克风设备!";}else{Infotxt.text = "设备名称为:" + Microphone.devices[0].ToString() + "请点击Start开始录音!";micConnected = true;Microphone.GetDeviceCaps(null, out minFreq, out maxFreq);if (minFreq == 0 && maxFreq == 0){maxFreq = 44100;}}}/// <summary>/// 开始录音/// </summary>public void Begin(){if (micConnected){if (!Microphone.IsRecording(null)){RecordedClip = Microphone.Start(null, false, 60, maxFreq);Infotxt.text = "开始录音!";}else{Infotxt.text = "正在录音中,请勿重复点击Start!";}}else{Infotxt.text = "请确认麦克风设备是否已连接!";}}/// <summary>/// 停止录音/// </summary>public void Stop(){data = GetRealAudio(ref RecordedClip);Microphone.End(null);Infotxt.text = "录音结束!";}/// <summary>/// 播放录音/// </summary>public void Player(){if (!Microphone.IsRecording(null)){audioSource.clip = RecordedClip;audioSource.Play();Infotxt.text = "正在播放录音!";}else{Infotxt.text = "正在录音中,请先停止录音!";}}/// <summary>/// 保存录音/// </summary>public void Save(){if (!Microphone.IsRecording(null)){fileName = DateTime.Now.ToString("yyyyMMddHHmmssffff");if (!fileName.ToLower().EndsWith(".wav")){//如果不是“.wav”格式的,加上后缀fileName += ".wav";}string path = Path.Combine(Application.persistentDataPath, fileName);//录音保存路径print(path);//输出路径Adress.text = path;using (FileStream fs = CreateEmpty(path)){fs.Write(data, 0, data.Length);WriteHeader(fs, RecordedClip); //wav文件头}}else{Infotxt.text = "正在录音中,请先停止录音!";}}/// <summary>/// 获取真正大小的录音/// </summary>/// <param name="recordedClip"></param>/// <returns></returns>public static byte[] GetRealAudio(ref AudioClip recordedClip){int position = Microphone.GetPosition(null);if (position <= 0 || position > recordedClip.samples){position = recordedClip.samples;}float[] soundata = new float[position * recordedClip.channels];recordedClip.GetData(soundata, 0);recordedClip = AudioClip.Create(recordedClip.name, position,recordedClip.channels, recordedClip.frequency, false);recordedClip.SetData(soundata, 0);int rescaleFactor = 32767;byte[] outData = new byte[soundata.Length * 2];for (int i = 0; i < soundata.Length; i++){short temshort = (short)(soundata[i] * rescaleFactor);byte[] temdata = BitConverter.GetBytes(temshort);outData[i * 2] = temdata[0];outData[i * 2 + 1] = temdata[1];}Debug.Log("position=" + position + "  outData.leng=" + outData.Length);return outData;}/// <summary>/// 写文件头/// </summary>/// <param name="stream"></param>/// <param name="clip"></param>public 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 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);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);}/// <summary>/// 创建wav格式文件头/// </summary>/// <param name="filepath"></param>/// <returns></returns>private FileStream CreateEmpty(string filepath){FileStream fileStream = new FileStream(filepath, FileMode.Create);byte emptyByte = new byte();for (int i = 0; i < 44; i++) //为wav文件头留出空间{fileStream.WriteByte(emptyByte);}return fileStream;}
}

在场景中创建4个button绑定脚本内4个方法,即可测试录音功能。

Unity3d 实现录音、播放和保存功能相关推荐

  1. unity3D实现录音功能,并将真实录音时长保存至本地(不能用可私信,附可执行文件下载地址)

    项目实现功能:在unity3D中通过Microphone的API实现录音功能,并将真正时长的录音文件以".wav"格式保存到本地. 环境:Win10     unity版本:201 ...

  2. unity3d录音播放

    直接挂载到组件上面,打包apk测试即可 using UnityEngine;/// <summary>/// 录音播放/// </summary> public class M ...

  3. 录音播放系统(实现pcm转码mp3,wav)

    本文介绍了基于waveX低级音频API采集音频,然后播放的技术,也支持实时的播放.对于将录音和播放分开的做法原因是为了保存pcm文件(未经压缩过的音频文件), 然后转码wav和mp3格式. PCM(P ...

  4. Qt之实现录音播放及raw(pcm)转wav格式

    简述 在上一篇 Qt 之 WAV文件解析 中详细地分析了wav格式文件的文件头信息.通过QAudioInput实现录音功能,但是录音生成的文件并不能用播放器打开,就算更改后缀名也无法识别(有时候下载的 ...

  5. 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能...

    原文:与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 [源码下载] 与众不同 windows phone (40 ...

  6. 微信小程序 用wx.getRecorderManager()和wx.createInnerAudioContext()制作一个简单的录音播放器(录制以及播放)

    在开发的时候公司提出了一个如题的要求,发现微信官方文档里好像没有相关的组件,就自己做了一个简单的,可以实现用户录制音频,播放和暂停的需求.放上来供大家参考 预览 wxml <view>&l ...

  7. uniapp实现微信小程序音频播放倒计时的功能,类似微信语音条

    uniapp实现微信小程序音频播放功能 最近需要有个项目需要用到音频播放,第一个想到的是audio标签,但是查阅了uniapp官方文档,发现audio组件已经不维护了. 官网推荐使用uni.creat ...

  8. iOS录音播放简例-AVFoundation

    iOS录音播放简例-AVFoundation 本例简单介绍一个demo,录制一段声音,再播放它,用的是AVFoundation框架. 一.添加AVFoundation框架,在.m文件中引入 #impo ...

  9. 微信小程序开发之——录音播放及文件上传下载-示例(2)

    一 概述 开始播放和暂停播放按钮,演示音频的播放和暂停功能 开始播放时,先下载服务器上的文件(1.mp3),然后进行播放 录音.停止.回放按钮,演示录音API的相关功能 上传按钮将录音文件上传到后台h ...

最新文章

  1. Luogu 2470 [SCOI2007]压缩
  2. transition标签_图解直到今天也没什么人知道的原生dialog标签(非常详细)
  3. php 注册回调函数,PHP回调函数
  4. 虚位以待C#-北京Objectiva
  5. wxpython应用程序对象与顶级窗口_wxPython--学习笔记
  6. 算法章节 递归、排序、⼆分查找
  7. EasyRecovery如何恢复wav音频文件
  8. ios判断点击的坐标点
  9. Android开发:菜单栏Menu用法讲解
  10. chrome中文本框样式问题
  11. 免费在线 Logo生成器
  12. MATLAB中常用的基本数学函数和三角函数
  13. 如何编写Word文档 多级编号
  14. 关于数据分析师的4点思考
  15. 使用Adobe Acrobat XI Pro进行pdf裁剪
  16. kbd_mode - 显示或者设置键盘模式
  17. Moleskine笔记本使用之感受【个人管理篇】
  18. vscode代码切换大小写的教程
  19. 我们有n根的木棍。现在从这些木棍中切割出来m条长度相同的木棍,问这m根木棍最长有多长?
  20. Spring MVC分析篇——HandleMapping

热门文章

  1. 大豆技术面分析_技术贴 | GIS三维视域分析—面要素
  2. Ringbuff note
  3. AXI总线详解完结篇
  4. Java基础:Java语言简介
  5. 一命二运三风水,四积功德五读书。六名七相八敬神,九交贵人十养生。
  6. SQL Pretty Printer美化SQL工具
  7. hdmi接口线_网友很困惑:连接显示器,DP光纤线和HDMI光纤线,究竟哪个更好?...
  8. 网易传媒基础架构演进之路
  9. [Mur-003] Mur源码分析之三:一个能运行起来的例子
  10. CDH集成了Kerberos后写入数据到HBase遇到的几个问题