gpt4 book ai didi

c# - Windows Phone 使用 NSpeex 编码和解码音频。解码有问题?

转载 作者:太空狗 更新时间:2023-10-29 19:48:01 24 4
gpt4 key购买 nike

我正在尝试使用 Nspeex 对录制的音频进行编码,然后通过互联网传输并在另一端解码。我正在 Windows Phone 7/8 中执行所有这些操作。要编码和解码,我使用以下代码。但是在解码时我没有得到正确的结果,我可以再次播放。谁能给我提供在WP7/8录制的音频上运行的编码和解码代码:

private static Microphone mic = Microphone.Default;

private static byte[] EncodeSpeech(byte[] buf, int len)
{
BandMode mode = GetBandMode(mic.SampleRate);
SpeexEncoder encoder = new SpeexEncoder(mode);

// set encoding quality to lowest (which will generate the smallest size in the fastest time)
encoder.Quality = 1;
int inDataSize = len / 2;

// convert to short array
short[] data = new short[inDataSize];
int sampleIndex = 0;
for (int index = 0; index < len; index += 2, sampleIndex++)
{
data[sampleIndex] = BitConverter.ToInt16(buf, index);
}

// note: the number of samples per frame must be a multiple of encoder.FrameSize
inDataSize = inDataSize - inDataSize % encoder.FrameSize;
var encodedData = new byte[len];
int encodedBytes = encoder.Encode(data, 0, inDataSize, encodedData, 0, len);
if (encodedBytes != 0)
{
// each chunk is laid out as follows:
// | 4-byte total chunk size | 4-byte encoded buffer size | <encoded-bytes> |
byte[] inDataSizeBuf = BitConverter.GetBytes(inDataSize);
byte[] sizeBuf = BitConverter.GetBytes(encodedBytes + inDataSizeBuf.Length);
byte[] returnBuf = new byte[encodedBytes + sizeBuf.Length + inDataSizeBuf.Length];
sizeBuf.CopyTo(returnBuf, 0);
inDataSizeBuf.CopyTo(returnBuf, sizeBuf.Length);
Array.Copy(encodedData, 0, returnBuf, sizeBuf.Length + inDataSizeBuf.Length, encodedBytes);
return returnBuf;
}
else
return buf;
}


private byte[] DecodeSpeech(byte[] buf)
{
BandMode mode = GetBandMode(mic.SampleRate);
SpeexDecoder decoder = new SpeexDecoder(mode);

byte[] inDataSizeBuf = new byte[4];
byte[] sizeBuf = new byte[4];
byte[] encodedBuf = new byte[buf.Length - 8];
Array.Copy(buf, 0, sizeBuf, 0, 4);
Array.Copy(buf, 4, inDataSizeBuf, 0, 4);
Array.Copy(buf, 8, encodedBuf, 0, buf.Length - 8);

int inDataSize = BitConverter.ToInt32(inDataSizeBuf, 0);
int size = BitConverter.ToInt32(sizeBuf, 0);
short[] decodedBuf = new short[inDataSize];
int decodedSize = decoder.Decode(encodedBuf, 0, encodedBuf.Length, decodedBuf, 0, false);

byte[] returnBuf = new byte[inDataSize * 2];
for (int index = 0; index < decodedBuf.Length; index++)
{
byte[] temp = BitConverter.GetBytes(decodedBuf[index]);
Array.Copy(temp, 0, returnBuf, index * 2, 2);
}

return returnBuf;
}


private static BandMode GetBandMode(int sampleRate)
{

if (sampleRate <= 8000)

return BandMode.Narrow;

if (sampleRate <= 16000)

return BandMode.Wide;

return BandMode.UltraWide;

}

最佳答案

我认为您的问题可能是您每次要编码音频时都在更新一个新的 SpeexEncoder。您应该尝试使它成为您类(class)的成员并重新使用它。

我查看了 Nspeex 的代码我注意到 SpeexEncoderNbEncoder 用于窄带。在那个类中,它看起来像是为了执行编码保留了一些以前的音频数据的历史记录。这应该意味着不同编码器实例的输出不会在一起。

private static Microphone mic = Microphone.Default;
private static SpeexEncoder encoder = CreateEncoder();

private static SpeexEncoder CreateEncoder()
{
BandMode mode = GetBandMode(mic.SampleRate);
SpeexEncoder encoder = new SpeexEncoder(mode);

// set encoding quality to lowest (which will generate the smallest size in the fastest time)
encoder.Quality = 1;
return encoder;
}

private static byte[] EncodeSpeech(byte[] buf, int len)
{
int inDataSize = len / 2;

...

关于c# - Windows Phone 使用 NSpeex 编码和解码音频。解码有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14406033/

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