Unity录音并且保存文件(去掉录音无效片段)
将以下代码复制,挂在场景中(也可以将此脚本写成不继承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录音并且保存文件(去掉录音无效片段)相关推荐
- uniapp - 超详细录音上传功能,点击开始录音 / 最后保存文件上传到服务器功能(附带详细示例源码及整个过程的实现方法,注释详细小白轻松上手改造)全端兼容!
效果图 网上的教程太乱用不了,无法改造成自己想要的效果. 在uniapp中开发中,实现点击录音功能,并支持保存录音文件.uniapp编译后全平台兼容通用, 你可以直接复制示例源码,跟着教程一步步配置, ...
- unity 录音并保存本地
我们可以使用unity自带的MicroPhone类来录音,回放录音,保存录音 具体代码如下: using System; using System.Collections; using System. ...
- 小米手机录音机录音音频保存在哪个路径文件夹?
小米手机录音机录音音频保存在哪个路径文件夹? 手机-MIUI-sound-recorder
- html调取android手机录音并保存,华为手机怎么导出录音文件并保存至电脑?
在日常生活中有很多需要录音的场景,比如上课时可以录下老师的讲义.开会时可以录下会议过程等等,使用手机就可以很方便进行录音.下面小编就以华为手机为例介绍一下如何录音,以及如何导出录音文件. 一.如何进行 ...
- Unity3D 录音, 压缩, 保存, 读取, 实时检测音量
unity 录音功能主要通过,Microphone这个类来完成.使用这个类自然可以跨平台,不用调用平台本地代码处理. private static AudioClip clip; private st ...
- 你知道小米手机便签如何导入录音和视频文件吗?
随着智能手机的发展,我们现在可以使用手机来满足更多的使用需求了,例如随手记录文字内容.随手拍照.拍视频.录音等,这些文件都已经成为了生活.工作非常重要的资料,因为我们需要通过以上多种格式的内容来记录信 ...
- 微信录音amr音频文件转mp3格式
直到现在,仍然不存在一项旨在网页上播放音频的标准.HTML5 规定了一种通过 audio 元素来包含音频的标准方法.audio 元素能够播放声音文件或者音频流.当前,audio 元素支持三种音频格式: ...
- Android实现长按录音松开保存、播放及根据声贝动画展示
Android实现长按录音松开保存及根据声贝动画展示 1.准备两张需要动态展示的图片 2.布局文件popup_window.xml 3.popup.xml 文件 4.封装MediaRecorder初始 ...
- iOS 实现录音并保存在指定文件目录下面
原理: 进入界面,先遍历文件目录,将所有的文件名,显示在uitableview中.在录音时需要设置session以及录音采样率. 1.ios录音主要使用ios自带的类,是工程中需要手动添加这俩个fra ...
最新文章
- android 判断空,Android空判断的坑
- webpack 入口文件 php,如何实现webpack多入口文件打包配置
- 【Java从0到架构师】SpringBoot - MyBatis
- 回溯算法解迷宫问题(java版)
- 敏捷教练 V 形六步法实战:从布朗运动到深度协作
- postman通过脚本动态获取token 和cookies
- cin.get()的用法
- 音频音乐与计算机的交融-音频音乐技术
- 006 管理Ceph的RBD块设备
- 苹果内存不够怎么办_手机内存清理了还是不够用?不知道这些方法,真是太可惜了...
- Gensim介绍以及实践
- JQuery中$(document)和$(window)是什么意思,有什么作用
- 为什么E-GREEDY算法中e越小,性能会更好
- 使用JOL工具直接查看出java对象大小
- Java设计模式博客全目录
- indesign怎么查找拼音_用Indesign CS 巧排拼音的方法
- 【Azure Data Platform】ETL工具(21)——Azure Databricks使用(1)——访问Azure Blob
- VUE 中实现echarts中国地图 人口迁徙
- 关于打的 umd 包在使用时,报 require is not defined 错误的问题出处
- 古典密码学与现代密码学
热门文章
- 微信小程序中使用 SHA256加密
- SystemVerilog中的Program的学习笔记
- outlook qr码在哪里_原平防伪溯源码_橙程(北京)科技有限公司
- hal库串口dma卡死_STM32 HAL库 串口DMA发送完成中断
- 启信宝受益所有人界面_希望您的项目成功吗? 然后确保其他人也可以从您的想法中受益。...
- Leetcode-标签为Tree 226. Invert Binary Tree
- CC2640R2F之NOTIFY发送子程序
- 九、freeRTOS_任务通知的使用
- 关于AI+医疗的调研
- OpenCV-Python图形图像处理:制作雪花飘落特效