public codecWrapper(NSpeex.BandMode mode, bool vbr) { encoder = new NSpeex.SpeexEncoder(mode); decoder = new NSpeex.SpeexDecoder(mode, false); encoder.VBR = vbr; encoder.Quality = 5; }
public static float[] DeCompress(NSpeex.SpeexDecoder speexDec, byte[] data, int dataLength) { float[] decoded = new float[data.Length]; short[] shortBuffer = new short[data.Length]; speexDec.Decode(data, 0, dataLength, shortBuffer, 0, false); shortBuffer.ToFloatArray(decoded, shortBuffer.Length); return(decoded); }
static float[] SpeexDecompress(NSpeex.SpeexDecoder speexDec, byte[] data, int dataLength) { float[] decoded = VoiceChatFloatPool.Instance.Get(); short[] shortBuffer = VoiceChatShortPool.Instance.Get(); speexDec.Decode(data, 0, dataLength, shortBuffer, 0, false); shortBuffer.ToFloatArray(decoded, shortBuffer.Length); VoiceChatShortPool.Instance.Return(shortBuffer); return(decoded); }
public byte[] Decode(byte[] encodedData) { //THIS IS IN NO WAY GOOD CODE! //Just experimenting! NSpeex.SpeexDecoder d = new NSpeex.SpeexDecoder(NSpeex.BandMode.Wide, false); NSpeex.SpeexJitterBuffer b = new NSpeex.SpeexJitterBuffer(d); b.Put(encodedData); short[] decoded = new short[1024]; b.Get(decoded); return null; }
public static int Decompress(NSpeex.SpeexDecoder speexDecoder, VoiceChatPacket packet, out float[] data) { switch (packet.Compression) { /* * case VoiceChatCompression.Raw: * { * short[9 buffer * * Buffer.BlockCopy(packet.Data, 0, shortBuffer, 0, packet.Length); * shortBuffer.ToFloatArray(data, packet.Length / 2); * return packet.Length / 2; * } * * case VoiceChatCompression.RawZlib: * { * byte[] unzipedData = ZlibDecompress(packet.Data, packet.Length); * * Buffer.BlockCopy(unzipedData, 0, shortBuffer, 0, unzipedData.Length); * shortBuffer.ToFloatArray(data, unzipedData.Length / 2); * return unzipedData.Length / 2; * } */ case VoiceChatCompression.Speex: { data = SpeexDecompress(speexDecoder, packet.Data, packet.Length); return(data.Length); } case VoiceChatCompression.Alaw: { data = ALawDecompress(packet.Data, packet.Length); return(packet.Length); } case VoiceChatCompression.AlawZlib: { byte[] alaw = ZlibDecompress(packet.Data, packet.Length); data = ALawDecompress(alaw, alaw.Length); return(alaw.Length); } } data = new float[0]; return(0); }
private short[] DecodeAudio(byte[] encodedData) { var decoder = new NSpeex.SpeexDecoder(NSpeex.BandMode.Wide, false); var outBuffer = new List <byte[]>(); var tmpBuffer = new short[1024]; int numPackets = BitConverter.ToInt32(encodedData, 0); List <int> packet_sizes = new List <int>(); for (int i = 0; i < numPackets; i++) { int frame_size = BitConverter.ToInt32(encodedData, 4 + (i * 4)); packet_sizes.Add(frame_size); } int fr_index = 0; for (var idx = 4 + (numPackets * 4); idx + packet_sizes[fr_index] < encodedData.Length; idx += packet_sizes[fr_index]) { var read = decoder.Decode(encodedData, idx, packet_sizes[fr_index], tmpBuffer, 0, false); var tmpData = new byte[read * 2]; for (var i = 0; i < read; i++) { var ba = BitConverter.GetBytes(tmpBuffer[i]); System.Array.Copy(ba, 0, tmpData, i * 2, 2); } outBuffer.Add(tmpData); fr_index++; } var fullSize = outBuffer.Sum(delegate(byte[] m) { return(m.Length); }); var retData = new byte[fullSize]; var offset = 0; for (int i = 0; i < outBuffer.Count; i++) { var b = outBuffer[i]; System.Array.Copy(b, 0, retData, offset, b.Length); offset += b.Length; } short[] pcm = new short[retData.Length / sizeof(short)]; Buffer.BlockCopy(retData, 0, pcm, 0, retData.Length); return(pcm); }
static StackObject *Ctor_0(ILIntepreter __intp, StackObject *__esp, IList <object> __mStack, CLRMethod __method, bool isNewObj) { ILRuntime.Runtime.Enviorment.AppDomain __domain = __intp.AppDomain; StackObject *ptr_of_this_method; StackObject *__ret = ILIntepreter.Minus(__esp, 2); ptr_of_this_method = ILIntepreter.Minus(__esp, 1); System.Boolean @enhanced = ptr_of_this_method->Value == 1; ptr_of_this_method = ILIntepreter.Minus(__esp, 2); NSpeex.BandMode @mode = (NSpeex.BandMode) typeof(NSpeex.BandMode).CheckCLRTypes(StackObject.ToObject(ptr_of_this_method, __domain, __mStack)); __intp.Free(ptr_of_this_method); var result_of_this_method = new NSpeex.SpeexDecoder(@mode, @enhanced); return(ILIntepreter.PushObject(__ret, __mStack, result_of_this_method)); }
//根据byte数组,得到一个声音片段 public AudioClip BytesToAudioClip(byte[] buffer) { //byte数组和声音长度的换算 这里暂时不知道稳不稳定 float _nAudioTime = buffer.Length / ByteInLengthPropotion; //长度不难为0否则会报错 if (_nAudioTime <= 0.1f) { _nAudioTime = 0.1f; } //创建声音片段,取样大小==声音长度*频率 AudioClip clip = AudioClip.Create("AA", (int)(_nAudioTime * RecordFrequency), 1, RecordFrequency, false); //将_list反序列成完整的声音包列表 List <ViChatPacket> list = new List <ViChatPacket>(); int offest = 0; while (offest < buffer.Length) { ViChatPacket packet = ViChatPacketSerializer.DeSerializer(buffer, offest); offest = offest + 8 + packet.Data.Length; //8和包长度可能是这个声音包的包头 list.Add(packet); } int sampleIndex = 0; NSpeex.SpeexDecoder _speexDec = new NSpeex.SpeexDecoder(NSpeex.BandMode.Narrow); //解析器 for (int i = 0; i < list.Count; ++i) { //取反序列化的声音包 ViChatPacket iterPacket = list[i]; //包内数据拷贝到数组 byte[] sampleData = new byte[iterPacket.DataLength]; Buffer.BlockCopy(iterPacket.Data, 0, sampleData, 0, iterPacket.Length); //解压 float[] sample = ViSpeexCompress.DeCompress(_speexDec, sampleData, iterPacket.Length); //将数据添加到声音片段 clip.SetData(sample, sampleIndex); sampleIndex += sample.Length; } return(clip); }
private short[] SpeexDecode(byte[] input, BandMode mode) { NSpeex.SpeexDecoder speexDec = null; int shortLen = 320; switch (mode) { case BandMode.Narrow: speexDec = m_narrow_dec; shortLen = 320; break; case BandMode.Wide: speexDec = m_wide_dec; shortLen = 640; break; case BandMode.UltraWide: speexDec = m_ultrawide_dec; shortLen = 1280; break; } byte[] len_bytes = USpeakPoolUtils.GetByte(4); System.Array.Copy(input, len_bytes, 4); int dataLength = BitConverter.ToInt32(len_bytes, 0); USpeakPoolUtils.Return(len_bytes); byte[] actual_bytes = USpeakPoolUtils.GetByte(input.Length - 4); Buffer.BlockCopy(input, 4, actual_bytes, 0, input.Length - 4); short[] decoded = USpeakPoolUtils.GetShort(shortLen); speexDec.Decode(actual_bytes, 0, dataLength, decoded, 0, false); USpeakPoolUtils.Return(actual_bytes); return(decoded); }
public SpeexCodex(BandMode mode) { this.mode = mode; encoder = new NSpeex.SpeexEncoder(SpeedxMode); decoder = new NSpeex.SpeexDecoder(SpeedxMode, false); encoder.VBR = true; encoder.Quality = 4; dataSize = encoder.FrameSize * (mode == BandMode.Narrow ? 8 : mode == BandMode.Wide ? 4 : 2); encodingBuffer = new short[dataSize]; encodedBuffer = new byte[dataSize]; decodeBuffer = new short[dataSize]; decodedBuffer = new float[dataSize]; int frequency = AudioUtils.GetFrequency(mode); var time = frequency / (float)dataSize; UnityEngine.Debug.Log("SpeedCodex created mode:" + mode + " dataSize:" + dataSize + " time:" + time); }
static StackObject *DeCompress_1(ILIntepreter __intp, StackObject *__esp, IList <object> __mStack, CLRMethod __method, bool isNewObj) { ILRuntime.Runtime.Enviorment.AppDomain __domain = __intp.AppDomain; StackObject *ptr_of_this_method; StackObject *__ret = ILIntepreter.Minus(__esp, 3); ptr_of_this_method = ILIntepreter.Minus(__esp, 1); System.Int32 @dataLength = ptr_of_this_method->Value; ptr_of_this_method = ILIntepreter.Minus(__esp, 2); System.Byte[] @data = (System.Byte[]) typeof(System.Byte[]).CheckCLRTypes(StackObject.ToObject(ptr_of_this_method, __domain, __mStack)); __intp.Free(ptr_of_this_method); ptr_of_this_method = ILIntepreter.Minus(__esp, 3); NSpeex.SpeexDecoder @speexDec = (NSpeex.SpeexDecoder) typeof(NSpeex.SpeexDecoder).CheckCLRTypes(StackObject.ToObject(ptr_of_this_method, __domain, __mStack)); __intp.Free(ptr_of_this_method); var result_of_this_method = Assets.Scripts.Module.Common.ViSpeak.Compress.ViSpeexCompress.DeCompress(@speexDec, @data, @dataLength); return(ILIntepreter.PushObject(__ret, __mStack, result_of_this_method)); }