小编Joa*_*erg的帖子

Unity 2018 - OnAudioFilterRead() 从缓冲区实时播放

首先让我说这是我第一次在这里提出问题。如果我的代码格式不清楚或表达不佳,请告诉我,我很乐意进行调整。

我正在为要在 Unity (C#) 中使用的工具进行概念设计,以允许我们实时“流式传输”AudioSource 的输出,然后从不同的游戏对象播放相同的音频。从本质上讲,我们将一个并行信号存储在缓冲区中,而原始 AudioSource 功能如预期,将其播放的剪辑发送到混音器,就像正常一样。

为了实现这一点,我正在尝试使用音频线程和 OnAudioFilterRead() 函数。为了提取浮点音频数据以通过管道传输到 OnAudioFilterRead(),我正在使用 AudioSource.GetOutputData,将其存储到一个数组中,然后将该数组提供给音频过滤器。我还创建了一个空的 AudioClip,从同一个数组中设置它的数据并在新的 GameObject 上播放该 AudioClip。

现在我可以从新的 GameObject 播放音频,但结果非常失真和令人不快,我将其归结为以下一项或多项;

  1. 正在以不同步的方式写入/读取音频缓冲区

  2. Unity 采样率导致剪辑出现问题。尝试过 44.1khz 和 48khz 的结果都低于标准,以及在剪辑上使用导入设置。Unity 2018.2 的文档非常薄弱,许多旧方法现已弃用。

  3. 外星人。

理想情况下,我将能够在没有可听伪影的情况下回传音频。我可以忍受一些延迟(~30-50ms),但音频质量不差。

下面是正在使用的代码。该脚本附加到 GameObject 上,该对象将从原始发射器接收此音频信号,并且它有自己的 AudioSource 用于播放和定位。

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

[RequireComponent(typeof(AudioSource))]
public class ECO_receiver : MonoBehaviour {


public AudioSource emitterSend;
private AudioSource audioSource;    
public AudioClip streamedClip;

public bool debugSampleData;
private float[] sampleDataArray;
public float sampleSize;
public float sampleFreq;

private int outputSampleRate;
public bool _bufferReady;                         


void Start …
Run Code Online (Sandbox Code Playgroud)

.net c# unity-game-engine

6
推荐指数
0
解决办法
1841
查看次数

标签 统计

.net ×1

c# ×1

unity-game-engine ×1