unity录音获取真实音频大小并获取字节流保存录音文件
unity录音长度时提前设置的并且结束录音后大文件大小也是预设大小,保存文件的话就会有许多无效字节,这里提供一种方法截取真正的AudioClip大小。需要注意的是先调用获取真实大小录音的方法再调用 Microphone.End(null);结束录音。
public AudioClip RecordedClip;
void 开始录音(){RecordedClip = Microphone.Start(null, false, 60, 16000);
}
void 停止录音(){byte[] data = 获取真实大小录音(ref RecordedClip);Microphone.End(null);string path = Application.persistentDataPath + "/录音.wav";Debug.Log("保存录音文件:" + path);using (FileStream fs = CreateEmpty(path)){fs.Write(data, 0, data.Length);WriteHeader(fs, RecordedClip); //wav文件头}
}
public static byte[] 获取真实大小录音(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;}
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);}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;}
unity录音获取真实音频大小并获取字节流保存录音文件相关推荐
- android 录音与播放录音 带根据音频大小动态效果
先看看效果图: 首先是布局文件: <?xml version="1.0" encoding="utf-8"?> <Linear ...
- php获取网络图片的大小,PHP获取远程图片尺寸和大小实例演示
这篇文章主要为大家详细介绍了PHP获取远程图片尺寸和大小实例演示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. PHP功能强大,今天361源码给大家介绍的是: ...
- android获取整体存储空间大小,Android 获取剩余存储空间
有时我们开Android项目开发时会用到文件存储或上传文件的一些操作,那么我们前提是要获取到该存储设备的大小,以方便于与我们需要操作的文件的大小做比较,如果操作的文件大小小于存储空间,那么就可以继续操 ...
- android 获取sd卡大小,Android 获取SD卡容量
SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件.因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android ...
- Unity 计算图片真实存储大小(Preview视图)
分析图片导入unity后,该图片所占存储大小,如有错误,请多指教. 问题:一张图片导入unity,那么这张图片打包apk,占用包体多大空间呢. 经过测试 一张16M(文件属性大小) 分辨率4096x4 ...
- AVFoundation – AVAssetTrack 获取视频 音频信息
目录 一.前言 1.AVAsset 2.AVAssetTrack 3.AVComposition / AVMutableComposition 4.AVMutableVideoComposition ...
- python实现录音小程序 界面_小程序如何实现录音 播放功能
第二步:编辑文件首先在src下创建一个test包并在test包下新建一个类MyRecord具体步骤代码如下所示: package test; import java.awt.*; import jav ...
- nginx 日志格式设置 和 负载均衡下 获取真实ip
log_format log 格式 '配置规则'; 日志格式设置: $remote_addr与$http_x_forwarded_for用以记录客户端的ip地址: $remote_user:用来记 ...
- ffmpeg系列-解决ffmpeg获取aac音频文件duration不准
这个问题是这样产生的,一同事反应会随机出现ijk获取到的aac文件的duration不准,发来一看,确实不准,在AE或者系统mediaplayer中得到的都是8.4秒(准确时间是MtkAACExtra ...
最新文章
- rpm 查看安装包 信息 时间 目录
- 【数据平台】python数据集连接和组合
- C语言求最大公约数和最小公倍数的几种算法
- 常见电容器图片_工业机器视觉的常见应用与施努卡VisionMax视觉系统介绍
- 盘点八个程序员必须知道的代码编辑器
- Revit族库管理系统
- 项目进度管理表模板_IT项目进度管理—你能驾驭的项目节奏
- Latex同时添加中英文摘要
- java 微信卡券开发 --创建微信卡券
- mysql判断用户名和密码是否正确_怎样分别判断用户名和密码是否正确
- Android 添加GridView中图片的圆角样式
- 不安装运行时运行 .NET 程序 - NativeAOT
- [转]河北省生源地信用助学贷款管理系统学生使用手册
- 1467: 平面点排序(一)(结构体专题)
- C语言中p, *p, p, *p, **p的理解-初级
- ERROR: node with name rabbit already running的解决方法
- Vue解决SEO的方案
- Java基础知识每日总结(19)---Java输入输出流、文件、递归
- 小程序毕设作品之微信积分商城小程序毕业设计成品(5)任务书
- 台式机拷盘加固态硬盘(SSD)