Unity中如何从指定音频源获取音频缓冲区并实现选择性音频流式传输?
针对音乐游戏的Photon Voice音频分流解决方案
嘿,刚好之前做过类似的Photon Voice音频隔离需求,给你梳理一套清晰的实现方案,完美适配你的场景:
核心思路:用Audio Mixer做音频分组+Photon Voice分流转传输
我们的目标是把游戏音乐、语音聊天、本地音频彻底隔离开,让Photon Voice只传输前两类,且各自独立不干扰。
1. 第一步:用Unity Audio Mixer划分音频组
先创建一个Audio Mixer,在里面新建三个混音组:
GameMusicGroup:专门承载你那18个游戏音乐的AudioSourceVoiceChatGroup:单独处理语音聊天的音频输入LocalOnlyGroup:放所有不需要传输的本地音频(比如UI音效、玩家操作反馈音)
然后逐个设置音频源的输出:
- 把18个游戏音乐AudioSource的Output选项,选择
GameMusicGroup - 语音聊天用的麦克风输入(不管是Unity原生AudioSource还是Photon Voice自带的捕获),输出设为
VoiceChatGroup - 本地音频源全部设为
LocalOnlyGroup
2. 单独传输游戏音乐流
不用再从AudioListener全局捕获了,换个更精准的方式:
- 创建一个空GameObject,命名为
MusicCaptureProxy,给它加个AudioSource组件 - 把这个AudioSource的Audio Mixer Group设置为
GameMusicGroup(它会自动接收该组的所有音频输出,不需要手动播放) - 给这个GameObject添加
PhotonVoiceSender组件,配置好传输通道、编码格式(比如选适合音乐的AAC编码),确保组件的AudioSource字段关联刚才创建的那个代理AudioSource
这样Photon Voice就只会发送这个代理捕获到的游戏音乐组音频,完全不会涉及其他音频。
3. 独立处理语音聊天
Photon Voice本身就有专门的语音捕获逻辑,单独配置即可:
- 用Photon官方的
PhotonVoiceRecorder组件捕获麦克风输入,把它的输出混音组设为VoiceChatGroup - 给这个Recorder配置独立的传输通道(和游戏音乐的通道区分开),这样其他玩家可以分别订阅语音流和音乐流,甚至单独调节音量
4. 彻底屏蔽本地音频传输
只要确保:
- 没有任何Photon Voice的Sender组件关联到
LocalOnlyGroup - 停用之前从AudioListener的
OnAudioFilterRead()捕获全局音频的代码
就能保证本地音频完全不会被传输到其他玩家那边。
5. 优化与调试小技巧
- 检查混音组的音量推子,避免音频过载导致失真(可以打开混音器的VU表实时监控)
- 匹配Photon Voice的采样率设置和游戏音乐的格式(比如游戏音乐是44100Hz立体声,就在Photon Voice Settings里对应调整)
- 测试时可以在接收端分别关闭/打开音乐流和语音流,确认两者独立且只有目标音频被传输
备选方案:自定义混音组音频捕获(适合进阶需求)
如果你不想用代理AudioSource,也可以直接从混音组获取音频数据传给Photon Voice,示例代码如下:
using UnityEngine; using Photon.Voice.Unity; [RequireComponent(typeof(AudioMixer))] public class CustomMusicSender : MonoBehaviour { [SerializeField] private AudioMixerGroup musicGroup; [SerializeField] private PhotonVoiceSender voiceSender; private float[] audioBuffer; private int targetChannels; private int targetSampleRate; void Start() { // 初始化缓冲区,匹配Photon Voice的帧大小 targetChannels = voiceSender.Channels; targetSampleRate = voiceSender.SamplingRate; audioBuffer = new float[voiceSender.FrameSize * targetChannels]; } void OnAudioFilterRead(float[] data, int channels) { // 从混音组获取音频数据 musicGroup.audioMixer.GetOutputData(audioBuffer, musicGroup); // 把数据传给Photon Voice Sender voiceSender.SendFrame(audioBuffer, targetSampleRate, targetChannels); } }
把这个脚本挂在你的AudioMixer所在的GameObject上,关联好对应的混音组和PhotonVoiceSender即可。
内容的提问来源于stack exchange,提问作者shadowsora
相关产品推荐
相关产品推荐

