如何在Unity中录制单声道音频剪辑或转换为单声道?
Unity麦克风单声道录制实现方案
你可以通过两种方式实现单声道音频录制:直接录制单声道,或者将录制后的立体声转换为单声道,以下是具体实现:
方案一:直接录制单声道
Unity的Microphone.Start返回的音频通道数由麦克风硬件决定。如果你的麦克风支持单声道输入,可先在系统音频设置中将麦克风设置为单声道模式,这样Unity录制出的音频直接就是单声道。
你也可以提前检查麦克风设备的参数,确认是否支持单声道:
public void StartRecord() { int minFreq, maxFreq; // 获取选中麦克风的参数范围 Microphone.GetDeviceCaps(selectedDevice, out minFreq, out maxFreq); // 启动录制 AudioSource audioSource = GetComponent<AudioSource>(); audioSource.clip = Microphone.Start(selectedDevice, false, 300, 44100); // 强制AudioSource以单声道播放(即使录制的是立体声,播放时转为单声道) audioSource.spatialBlend = 1f; Debug.Log("选中的设备是" + selectedDevice); recordedAudioClip = audioSource.clip; startRecordingTime = Time.time; }
方案二:录制后将立体声转为单声道
如果麦克风只能输出立体声,可在录制完成后将音频转换为单声道。核心逻辑是将多声道的采样数据取平均值,合并为单声道数据:
修改你的StopRecord方法如下:
public AudioClip StopRecord() { float recordDuration = Time.time - startRecordingTime; int sampleCount = (int)(recordDuration * recordedAudioClip.frequency); int originalChannelCount = recordedAudioClip.channels; // 创建单声道的新音频剪辑 AudioClip monoAudioClip = AudioClip.Create( recordedAudioClip.name, sampleCount, 1, recordedAudioClip.frequency, false ); float[] originalAudioData = new float[sampleCount * originalChannelCount]; recordedAudioClip.GetData(originalAudioData, 0); float[] monoAudioData = new float[sampleCount]; // 合并多声道数据为单声道(取各声道采样值的平均值) for (int i = 0; i < sampleCount; i++) { float channelSum = 0f; for (int channel = 0; channel < originalChannelCount; channel++) { channelSum += originalAudioData[i * originalChannelCount + channel]; } monoAudioData[i] = channelSum / originalChannelCount; } monoAudioClip.SetData(monoAudioData, 0); this.recordedAudioClip = monoAudioClip; return recordedAudioClip; }
这段代码会自动处理原音频的声道数,不管是单声道还是立体声,最终都会输出单声道音频。
内容的提问来源于stack exchange,提问作者Peter Bonnebaigt
相关产品推荐
相关产品推荐

