/// <summary> /// 初始化Speex编解码器实例 /// </summary> /// <param name="quality">压缩质量,值越大压缩比越小,音质越清晰,有效范围 1-10</param> /// <param name="modelType">编码器类型</param> public SpeexBase(ModelType modelType, int quality) { _encodeStateIntptr = SpeexEncodeApi.Speex_encoder_init(SpeexCommon.Speex_lib_get_mode((int)modelType)); //初始化模式结构体 拿到state指针 _decodeStateIntptr = SpeexDecodeApi.Speex_decoder_init(SpeexCommon.Speex_lib_get_mode((int)modelType)); //初始化模式结构体 拿到state指针 SpeexBitsApi.Speex_bits_init(ref _encodeSpeexBits); //初始化数据结构体 SpeexBitsApi.Speex_bits_init(ref _decodeSpeexBits); //初始化数据结构体 this.SetEncode(SetCoderState.Quality, quality); }
/// <summary> /// 对Speex编解码器进行后续的清理工作 /// </summary> public void Dispose() { SpeexEncodeApi.Speex_encoder_destroy(_encodeStateIntptr); SpeexDecodeApi.Speex_decoder_destroy(_decodeStateIntptr); SpeexBitsApi.Speex_bits_destroy(ref _encodeSpeexBits); SpeexBitsApi.Speex_bits_destroy(ref _decodeSpeexBits); GC.Collect(); }
/// <summary> /// 解压Speex音频数据流 /// </summary> /// <param name="input">需要解压的数据流</param> /// <returns>解压后的正常音频数据</returns> public byte[] DecodeBase(byte[] input) { SpeexBitsApi.Speex_bits_reset(ref _decodeSpeexBits); SpeexBitsApi.Speex_bits_read_from(ref _decodeSpeexBits, input, input.Length); //int i = SpeexBitsApi.Speex_bits_nbytes(ref _decodeSpeexBits); short[] buffer = new short[160]; int len = SpeexDecodeApi.Speex_decode_int(_decodeStateIntptr, ref _decodeSpeexBits, buffer); return(SpeexHelper.ShortsToBytes(buffer)); }