Unity录音

上周做过Unity录音,(不知道的可以到网上查找一下,代码挺多的),不过只能录制麦克风的声音,项目需要同时录制背景音和麦克风传进去的声音,经过探索,现已可以录制:

   首先需要知道,即使用电脑录音,想录制电脑声音,也需要把立体声混音设置成默认值,如图:

然后我们只需把HTC VIVE设置一下即可(设置录制到设备,选择立体声混音)

完事。

新增:(后期测试有点问题,又测试了好多次,发现麦克风需要设置为默认通信设备,切侦听需打开

 

 

转载于:https://www.cnblogs.com/mabingly/p/6366092.html

<think>嗯,用户想在Unity中实现录音并实时获取音频流数据。我需要结合他们提供的引用内容来解答这个问题。首先,根据引用[1]和[2],Unity的Microphone类可以用来录音,生成AudioClip。然后,用户需要实时获取音频数据,而不仅仅是录音后的处理。引用[3]提到WebGL下获取实时数据的问题,但用户可能不限于WebGL平台,所以需要考虑通用方法。 步骤应该包括:初始化麦克风设备,开始录音,然后在每一帧中读取音频数据。根据引用[1],使用Microphone.Start开始录音,并持续写入AudioClip。然后,使用AudioClip.GetData方法获取数据,但需要处理循环缓冲区的问题,因为麦克风数据是循环写入的。 实时获取的关键在于分块处理数据,比如在Update中每帧读取新增的音频样本。需要计算当前录音的位置,然后提取自上次读取以来的新数据。这样用户就能实时处理音频流了。此外,引用[3]提到某些插件无法获取实时数据,所以可能需要用原生的Microphone类配合代码处理循环缓冲区。 还要注意不同平台的可能差异,比如WebGL可能需要特殊处理,但用户的问题没有特别说明平台,所以先给出通用解决方案。最后,确保代码示例正确,包括开始录音、读取数据和处理循环索引的部分。</think>### 分步实现Unity录音并实时获取音频流数据 #### 步骤1:初始化录音设备 ```csharp using UnityEngine; public class AudioRecorder : MonoBehaviour { private AudioClip recordingClip; private string selectedDevice; private int sampleRate = 44100; // 采样率 private bool isRecording = false; private int lastSamplePosition = 0; void Start() { // 获取可用麦克风设备 if (Microphone.devices.Length > 0) { selectedDevice = Microphone.devices[0]; } } } ``` #### 步骤2:启动录音 ```csharp public void StartRecording() { // 创建最大时长1分钟的音频片段 recordingClip = Microphone.Start(selectedDevice, true, 60, sampleRate); isRecording = true; lastSamplePosition = 0; // 重置读取位置 } ``` #### 步骤3:实时获取音频数据 ```csharp void Update() { if (!isRecording) return; int currentSamplePosition = Microphone.GetPosition(selectedDevice); int sampleCount = currentSamplePosition - lastSamplePosition; // 处理循环缓冲区 if (sampleCount < 0) { sampleCount = (recordingClip.samples * recordingClip.channels) - lastSamplePosition + currentSamplePosition; } if (sampleCount > 0) { float[] dataChunk = new float[sampleCount]; recordingClip.GetData(dataChunk, lastSamplePosition); // 在此处处理实时音频数据(如FFT分析、传输等) ProcessAudioData(dataChunk); lastSamplePosition = currentSamplePosition % (recordingClip.samples * recordingClip.channels); } } ``` #### 步骤4:停止录音 ```csharp public void StopRecording() { Microphone.End(selectedDevice); isRecording = false; // 处理最终数据 float[] finalData = new float[recordingClip.samples * recordingClip.channels]; recordingClip.GetData(finalData, 0); } ``` #### 关键点说明: 1. **循环缓冲区处理**:麦克风音频数据存储在环形缓冲区中,需要使用`Microphone.GetPosition`获取当前写入位置[^1] 2. **分块读取**:每帧读取新增的音频样本,避免一次性处理过多数据 3. **多通道处理**:`recordingClip.channels`获取声道数,数据存储为交错格式(LRLR...) 4. **采样率匹配**:需保证录音、播放和分析使用相同的采样率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值