将以下代码复制,挂在场景中(也可以将此脚本写成不继承mono的单例)

开始录音方法StartRecord。

停止录音方法StopRecord,参数为要保存的文件名,这里将文件保存到Application.persistentDataPath路径下

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;/// <summary>
/// unity录音的clip直接转byte系统无法正确生成音频文件,而且时间是定死的
/// 所以基本逻辑是:停止录音时,通过一定方法把有效byte转成可以生成的音频文件,再用www加载,传服务器
/// </summary>
public class MicphoneRecord : MonoBehaviour
{AudioSource _audio;AudioSource audio{get{if (_audio == null){_audio = gameObject.AddComponent<AudioSource>();}return _audio;}}void Start(){string[] ms = Microphone.devices;deviceCount = ms.Length;if (deviceCount == 0){Debug.Log("no microphone found");}}const int HEADER_SIZE = 44;const int RECORD_TIME = 30;int deviceCount;string bitrate = "128";const int frequency = 44100;private string path_1;public void StartRecord(){audio.Stop();audio.loop = false;audio.mute = true;audio.clip = Microphone.Start(null, false, RECORD_TIME, frequency);while (!(Microphone.GetPosition(null) > 0)){}audio.Play();}public void StopRecord(string path){if (!Microphone.IsRecording(null)){return;}Microphone.End(null);audio.Stop();//string path = "64_3_1.wav";audio.clip = GetTransformAudioClip(audio.clip, 0);SaveMusic(path);HttpHelper.Instance.UpLoadRecordClip(path);}public void PlayRecord(){if (Microphone.IsRecording(null)){return;}if (audio.clip == null){return;}audio.mute = false;audio.loop = false;audio.Play();}public void SaveMusic(string filename){Save(filename, audio.clip);}public static bool Save(string filename, AudioClip clip){//if (!filename.ToLower().EndsWith(".wav"))//{//    filename = ".wav";//}if (!filename.EndsWith(".wav")){filename = ".wav";}#if UNITY_IPHONE
//      path_1 = Application.persistentDataPath;  string filepath = Path.Combine(Application.persistentDataPath, filename);
#endif#if UNITY_STANDALONE_WINstring filepath =  filename;
#endif
#if UNITY_ANDROIDstring filepath = Path.Combine(Application.persistentDataPath, filename);
#endif//      string filepath = Path.Combine(Application.persistentDataPath, filename);  Debug.Log(filepath);// Make sure directory exists if user is saving to sub dir.  Directory.CreateDirectory(Path.GetDirectoryName(filepath));using (FileStream fileStream = CreateEmpty(filepath)){ConvertAndWrite(fileStream, clip);WriteHeader(fileStream, clip);}return true; // TODO: return false if there's a failure saving the file  }static FileStream CreateEmpty(string filepath){FileStream fileStream = new FileStream(filepath, FileMode.Create);byte emptyByte = new byte();for (int i = 0; i < HEADER_SIZE; i++) //preparing the header  {fileStream.WriteByte(emptyByte);}return fileStream;}static void ConvertAndWrite(FileStream fileStream, AudioClip clip){float[] samples = new float[clip.samples];clip.GetData(samples, 0);Int16[] intData = new Int16[samples.Length];//converting in 2 float[] steps to Int16[], //then Int16[] to Byte[]  Byte[] bytesData = new Byte[samples.Length * 2];//bytesData array is twice the size of  //dataSource array because a float converted in Int16 is 2 bytes.  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);}static 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 * channels * 2);fileStream.Write(subChunk2, 0, 4);//      fileStream.Close();  }private AudioClip GetTransformAudioClip(AudioClip srcAudioClip, float minSecond){var samples = new float[srcAudioClip.samples];srcAudioClip.GetData(samples, 0);return GetTransformAudioClip(new List<float>(samples), minSecond, srcAudioClip.channels, srcAudioClip.frequency);}private AudioClip GetTransformAudioClip(List<float> samples, float min, int channels, int hz){return GetTransformAudioClip(samples, min, channels, hz, false, false);}private AudioClip GetTransformAudioClip(List<float> samples, float min, int channels, int hz, bool _3D, bool stream){int i;bool isLessMin = true;for (i = 0; i < samples.Count; i++){if (Mathf.Abs(samples[i]) > min){isLessMin = false;break;}}// less than the min seconds, so can't get the audio clipif (isLessMin)return null;if (samples.Count > i){samples.RemoveRange(0, i);}if (samples.Count > i){samples.RemoveRange(0, i);}for (i = samples.Count - 1; i > 0; i--){if (Mathf.Abs(samples[i]) > min){break;}}if (samples.Count > (samples.Count - i)){samples.RemoveRange(i, samples.Count - i);}var clip = AudioClip.Create("TempClip", samples.Count, channels, hz, _3D, stream);clip.SetData(samples.ToArray(), 0);return clip;}
}

Unity录音并且保存文件(去掉录音无效片段)相关推荐

  1. uniapp - 超详细录音上传功能,点击开始录音 / 最后保存文件上传到服务器功能(附带详细示例源码及整个过程的实现方法,注释详细小白轻松上手改造)全端兼容!

    效果图 网上的教程太乱用不了,无法改造成自己想要的效果. 在uniapp中开发中,实现点击录音功能,并支持保存录音文件.uniapp编译后全平台兼容通用, 你可以直接复制示例源码,跟着教程一步步配置, ...

  2. unity 录音并保存本地

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

  3. 小米手机录音机录音音频保存在哪个路径文件夹?

    小米手机录音机录音音频保存在哪个路径文件夹? 手机-MIUI-sound-recorder

  4. html调取android手机录音并保存,华为手机怎么导出录音文件并保存至电脑?

    在日常生活中有很多需要录音的场景,比如上课时可以录下老师的讲义.开会时可以录下会议过程等等,使用手机就可以很方便进行录音.下面小编就以华为手机为例介绍一下如何录音,以及如何导出录音文件. 一.如何进行 ...

  5. Unity3D 录音, 压缩, 保存, 读取, 实时检测音量

    unity 录音功能主要通过,Microphone这个类来完成.使用这个类自然可以跨平台,不用调用平台本地代码处理. private static AudioClip clip; private st ...

  6. 你知道小米手机便签如何导入录音和视频文件吗?

    随着智能手机的发展,我们现在可以使用手机来满足更多的使用需求了,例如随手记录文字内容.随手拍照.拍视频.录音等,这些文件都已经成为了生活.工作非常重要的资料,因为我们需要通过以上多种格式的内容来记录信 ...

  7. 微信录音amr音频文件转mp3格式

    直到现在,仍然不存在一项旨在网页上播放音频的标准.HTML5 规定了一种通过 audio 元素来包含音频的标准方法.audio 元素能够播放声音文件或者音频流.当前,audio 元素支持三种音频格式: ...

  8. Android实现长按录音松开保存、播放及根据声贝动画展示

    Android实现长按录音松开保存及根据声贝动画展示 1.准备两张需要动态展示的图片 2.布局文件popup_window.xml 3.popup.xml 文件 4.封装MediaRecorder初始 ...

  9. iOS 实现录音并保存在指定文件目录下面

    原理: 进入界面,先遍历文件目录,将所有的文件名,显示在uitableview中.在录音时需要设置session以及录音采样率. 1.ios录音主要使用ios自带的类,是工程中需要手动添加这俩个fra ...

最新文章

  1. android 判断空,Android空判断的坑
  2. webpack 入口文件 php,如何实现webpack多入口文件打包配置
  3. 【Java从0到架构师】SpringBoot - MyBatis
  4. 回溯算法解迷宫问题(java版)
  5. 敏捷教练 V 形六步法实战:从布朗运动到深度协作
  6. postman通过脚本动态获取token 和cookies
  7. cin.get()的用法
  8. 音频音乐与计算机的交融-音频音乐技术
  9. 006 管理Ceph的RBD块设备
  10. 苹果内存不够怎么办_手机内存清理了还是不够用?不知道这些方法,真是太可惜了...
  11. Gensim介绍以及实践
  12. JQuery中$(document)和$(window)是什么意思,有什么作用
  13. 为什么E-GREEDY算法中e越小,性能会更好
  14. 使用JOL工具直接查看出java对象大小
  15. Java设计模式博客全目录
  16. indesign怎么查找拼音_用Indesign CS 巧排拼音的方法
  17. 【Azure Data Platform】ETL工具(21)——Azure Databricks使用(1)——访问Azure Blob
  18. VUE 中实现echarts中国地图 人口迁徙
  19. 关于打的 umd 包在使用时,报 require is not defined 错误的问题出处
  20. 古典密码学与现代密码学

热门文章

  1. 微信小程序中使用 SHA256加密
  2. SystemVerilog中的Program的学习笔记
  3. outlook qr码在哪里_原平防伪溯源码_橙程(北京)科技有限公司
  4. hal库串口dma卡死_STM32 HAL库 串口DMA发送完成中断
  5. 启信宝受益所有人界面_希望您的项目成功吗? 然后确保其他人也可以从您的想法中受益。...
  6. Leetcode-标签为Tree 226. Invert Binary Tree
  7. CC2640R2F之NOTIFY发送子程序
  8. 九、freeRTOS_任务通知的使用
  9. 关于AI+医疗的调研
  10. OpenCV-Python图形图像处理:制作雪花飘落特效