【发布时间】:2013-08-15 12:17:05
【问题描述】:
所以我将浮点 32 位转换为立体声中的 16 位。由于我自己并不完全理解,遗憾的是它几乎是复制粘贴。
但我想知道它是否可以在质量或速度方面进行改进? 并不是说它们中的任何一个都是可怕的或什么的。
void SendWaloop(object sender, NAudio.Wave.WaveInEventArgs e)
{
byte[] newArray16Bit = new byte[e.BytesRecorded / 2];
short two;
float value;
for (int i = 0, j = 0; i < e.BytesRecorded; i += 4, j += 2)
{
value = (BitConverter.ToSingle(e.Buffer, i));
two = (short)(value * short.MaxValue);
newArray16Bit[j] = (byte)(two & 0xFF);
newArray16Bit[j + 1] = (byte)((two >> 8) & 0xFF);
}
if (connect == true && MuteMic.Checked == false)
{
udpSend.Send(newArray16Bit, newArray16Bit.Length, otherPartyIP.Address.ToString(), 1500);
}
}
很好,它将缓冲区从 32 位转换为 16 位,并使用 UDP 发送,没什么奇怪的。
虽然对我来说这看起来很复杂,但据我了解,它只是删除每 4 个字节或类似的东西。
编辑:
unsafe
{
byte[] newArray16Bit = new byte[e.BytesRecorded / 2];
fixed (byte* sourcePtr = e.Buffer)
fixed (byte* targetPtr = newArray16Bit)
{
float* sourceTyped = (float*)sourcePtr;
short* targetTyped = (short*)targetPtr;
int count = e.BytesRecorded / 4;
for (int i = 0; i < count; i++)
{
targetTyped[i] = (short)(sourceTyped[i] * short.MaxValue);
}
}
if (connect == true && MuteMic.Checked == false)
{
udpSend.Send(newArray16Bit, newArray16Bit.Length, otherPartyIP.Address.ToString(), 1500);
}
}
}
【问题讨论】:
-
你应该在CodeReview问这个问题
-
我猜是这样,但是当我上次问这样的问题时,他们说我不应该在那里问。如果没有人在这里回答,那么会问那里:)
-
为什么用short而不是int16_t?由于您依赖它是 16 位,因此您应该确保它确实是...
-
阅读their help,特别是“我很困惑!本网站的主题有哪些问题?”下的部分。我不去那里,所以我无法确定,但它看起来应该属于那里。如果某些东西适合其他地方,它不应该出现在Stack Overflow。
-
@Dan 它是 C#,所以 short 是保证是 16 位的。
标签: c#