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录音获取真实音频大小并获取字节流保存录音文件相关推荐

  1. android 录音与播放录音 带根据音频大小动态效果

    先看看效果图:         首先是布局文件: <?xml version="1.0" encoding="utf-8"?> <Linear ...

  2. php获取网络图片的大小,PHP获取远程图片尺寸和大小实例演示

    这篇文章主要为大家详细介绍了PHP获取远程图片尺寸和大小实例演示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. PHP功能强大,今天361源码给大家介绍的是: ...

  3. android获取整体存储空间大小,Android 获取剩余存储空间

    有时我们开Android项目开发时会用到文件存储或上传文件的一些操作,那么我们前提是要获取到该存储设备的大小,以方便于与我们需要操作的文件的大小做比较,如果操作的文件大小小于存储空间,那么就可以继续操 ...

  4. android 获取sd卡大小,Android 获取SD卡容量

    SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件.因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android ...

  5. Unity 计算图片真实存储大小(Preview视图)

    分析图片导入unity后,该图片所占存储大小,如有错误,请多指教. 问题:一张图片导入unity,那么这张图片打包apk,占用包体多大空间呢. 经过测试 一张16M(文件属性大小) 分辨率4096x4 ...

  6. AVFoundation – AVAssetTrack 获取视频 音频信息

    目录 一.前言 1.AVAsset 2.AVAssetTrack 3.AVComposition / AVMutableComposition 4.AVMutableVideoComposition ...

  7. python实现录音小程序 界面_小程序如何实现录音 播放功能

    第二步:编辑文件首先在src下创建一个test包并在test包下新建一个类MyRecord具体步骤代码如下所示: package test; import java.awt.*; import jav ...

  8. nginx 日志格式设置 和 负载均衡下 获取真实ip

    log_format log 格式   '配置规则'; 日志格式设置: $remote_addr与$http_x_forwarded_for用以记录客户端的ip地址: $remote_user:用来记 ...

  9. ffmpeg系列-解决ffmpeg获取aac音频文件duration不准

    这个问题是这样产生的,一同事反应会随机出现ijk获取到的aac文件的duration不准,发来一看,确实不准,在AE或者系统mediaplayer中得到的都是8.4秒(准确时间是MtkAACExtra ...

最新文章

  1. rpm 查看安装包 信息 时间 目录
  2. 【数据平台】python数据集连接和组合
  3. C语言求最大公约数和最小公倍数的几种算法
  4. 常见电容器图片_工业机器视觉的常见应用与施努卡VisionMax视觉系统介绍
  5. 盘点八个程序员必须知道的代码编辑器
  6. Revit族库管理系统
  7. 项目进度管理表模板_IT项目进度管理—你能驾驭的项目节奏
  8. Latex同时添加中英文摘要
  9. java 微信卡券开发 --创建微信卡券
  10. mysql判断用户名和密码是否正确_怎样分别判断用户名和密码是否正确
  11. Android 添加GridView中图片的圆角样式
  12. 不安装运行时运行 .NET 程序 - NativeAOT
  13. [转]河北省生源地信用助学贷款管理系统学生使用手册
  14. 1467: 平面点排序(一)(结构体专题)
  15. C语言中p, *p, p, *p, **p的理解-初级
  16. ERROR: node with name rabbit already running的解决方法
  17. Vue解决SEO的方案
  18. Java基础知识每日总结(19)---Java输入输出流、文件、递归
  19. 小程序毕设作品之微信积分商城小程序毕业设计成品(5)任务书
  20. 台式机拷盘加固态硬盘(SSD)

热门文章

  1. suse linux双网卡绑定,suse linux双网卡绑定设置详解
  2. 安装windows11,跳过联网激活,跳过登录微软账户
  3. 异步API中promise解决回调地狱问题和异步函数async终极解决方案
  4. ssoj4010: 秀秀的照片(photo)
  5. ThinkPHP内核全行业小程序运营管理系统源码免费分享下载
  6. 爬取网易财经全部A股上市公司年报
  7. leetcode刷题记录day005:1和36
  8. SmartTools
  9. 菲涅尔透镜的原理及应用
  10. 决策树算法学习笔记(三)-预测隐形眼镜类型