我正在使用Speex对原始数据进行编码,但在对数据进行解码后,音频以更快的速度播放,因为它会让您听起来像花栗鼠.我正在使用
NSpeex和Silverlight 4.
8kHz采样
编码功能:
JSpeexEnc encoder = new JSpeexEnc(); int rawDataSize = 0; public byte[] EncodeAudio(byte[] rawData) { var encoder = new SpeexEncoder(BandMode.Narrow); var inDataSize = rawData.Length / 2; var inData = new short[inDataSize]; for (var index = 0; index < rawData.Length; index += 2) { inData[index / 2] = BitConverter.ToInt16(rawData,index); } inDataSize = inDataSize - inDataSize % encoder.FrameSize; var encodedData = new byte[rawData.Length]; var encodedBytes = encoder.Encode(inData,inDataSize,encodedData,encodedData.Length); byte[] encodedAudioData = null; if (encodedBytes != 0) { encodedAudioData = new byte[encodedBytes]; Array.Copy(encodedData,encodedAudioData,encodedBytes); } rawDataSize = inDataSize; // Count of encoded shorts,for debugging return encodedAudioData; }
解码功能:
SpeexDecoder decoder = new SpeexDecoder(BandMode.Narrow); public byte[] Decode(byte[] encodedData) { try { short[] decodedFrame = new short[8000]; // should be the same number of samples as on the capturing side int decoderBytes = decoder.Decode(encodedData,encodedData.Length,decodedFrame,false); byte[] decodedData = new byte[encodedData.Length]; byte[] decodedAudioData = null; decodedAudioData = new byte[decoderBytes * 2]; for (int shortIndex = 0,byteIndex = 0; byteIndex < decoderBytes; shortIndex++) { BitConverter.GetBytes(decodedFrame[shortIndex + byteIndex]).CopyTo(decodedAudioData,byteIndex * 2); byteIndex++; } // todo: do something with the decoded data return decodedAudioData; } catch (Exception ex) { ShowMessageBox(ex.Message.ToString()); return null; } }
播放音频:
void PlayWave(byte[] PCMBytes) { byte[] decodedBuffer = Decode(PCMBytes); MemoryStream ms_PCM = new MemoryStream(decodedBuffer); MemoryStream ms_Wave = new MemoryStream(); _pcm.SavePcmToWav(ms_PCM,ms_Wave,16,8000,1); WaveMediaStreamSource WaveStream = new WaveMediaStreamSource(ms_Wave); mediaElement1.SetSource(WaveStream); mediaElement1.Play(); }
解决方法
对于迟到的回应抱歉,但我弄清楚问题是什么.
在我的解码函数中,我遍历解码的短数组,但我只是将一半的字节复制到我的新字节数组中.
它需要看起来像这样:
decodedAudioData = new byte[decoderBytes * 2]; for (int shortIndex = 0,byteIndex = 0; shortIndex < decodedFrame.Length; shortIndex++,byteIndex += 2) { byte[] temp = BitConverter.GetBytes(decodedFrame[shortIndex]); decodedAudioData[byteIndex] = temp[0]; decodedAudioData[byteIndex + 1] = temp[1]; }