You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何从指定音频源获取音频缓冲区并实现选择性音频流式传输?

针对音乐游戏的Photon Voice音频分流解决方案

嘿,刚好之前做过类似的Photon Voice音频隔离需求,给你梳理一套清晰的实现方案,完美适配你的场景:

核心思路:用Audio Mixer做音频分组+Photon Voice分流转传输

我们的目标是把游戏音乐、语音聊天、本地音频彻底隔离开,让Photon Voice只传输前两类,且各自独立不干扰。

1. 第一步:用Unity Audio Mixer划分音频组

先创建一个Audio Mixer,在里面新建三个混音组:

  • GameMusicGroup:专门承载你那18个游戏音乐的AudioSource
  • VoiceChatGroup:单独处理语音聊天的音频输入
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:40:25