gpt4 book ai didi

c# - 将 IntPtr 转换为音频数据数组

转载 作者:行者123 更新时间:2023-12-03 01:37:14 30 4
gpt4 key购买 nike

我一直在尝试实现 WebRTC Unity 上的音频/视频通信。到目前为止,在 this blog post 的帮助下(和谷歌翻译)和互联网上的极少数例子,我已经设法使用 WebRTC 在 Unity 上做了很多工作。 Unity Plugin .

但现在我被困住了。 的伟大 Unity 示例项目mhama 遗憾的是,没有示例说明如何将我从 native 代码获得的数据转换为可在 Unity 中用作音频数据的数据。

我从回调中得到的信息是

(IntPtr data, int bitsPerSample, int sampleRate, int numberOfChannels, int numberOfFrames)

native 代码中的数据声明为
const void* audio_data

我知道要创建 Unity 可以用来播放声音的音频剪辑,我需要一个 float样本值来自 -1 to 1 的数组.我该怎么做 IntPtr float 的数据和所有额外信息数组,是我不知道该怎么做的事情。

Here's the sample I'm using as a base

最佳答案

我不确定你是否可以在没有不安全代码的情况下做到这一点。您需要确保您的项目允许使用不安全代码。

// allocate the float arrays for the output. 
// numberOfChannels x numberOfFrames
float[][] output = new float[numberOfChannels][];
for (int ch = 0 ; ch < numberOfChannels; ++ch)
output[ch] = new float[numberOfFrames];

// scaling factor for converting signed PCM into float (-1.0 to 1.0)
const double scaleIntToFloat = 1.0/0x7fffffff;

unsafe
{
// obtain a pointer to the raw PCM audio data.
byte *ptr = (byte *)data.ToPointer();

for (int frame = 0 ; frame < numberOfFrames; ++frame)
{
for (int ch = 0 ; ch < numberOfChannels; ++ch)
{
switch (bitsPerSample)
{
case 32:
// shift 4 bytes into the integer value
int intValue = *ptr++ << 24 & *ptr++ << 16 &
*ptr++ << 8 & *ptr++;
// scale the int to float and store.
output[ch][frame] = scaleIntToFloat * intValue;
break;
case 16:
// shift 2 bytes into the integer value. Note:
// shifting into the upper 16 bits to simplify things,
// e.g. multiply by the same scaling factor.
int intValue = *ptr++ << 24 & *ptr++ << 16;
output[ch][frame] = scaleIntToFloat * intValue;
break;
case 24:
...
case 8:
// not 8-bit is typically unsigned. Google it if
// you need to.
}
}
}
}

您可以通过在此站点搜索 PCM 到 float 的转换来找到其他转换。此外,根据您的情况,您可能需要不同的字节序。如果是这样,请转到 intValue以不同的字节顺序。

关于c# - 将 IntPtr 转换为音频数据数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51505873/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com