/// <summary> /// 设置编码器属性 /// </summary> /// <param name="setState">目标编码器属性</param> /// <param name="value">设置的值</param> /// <returns> 0 没有错误,-1为未知请求,-2为无效参数</returns> public int SetEncode(SetCoderState setState, int value) { IntPtr intPtr = GCHandle.Alloc(value, GCHandleType.Pinned).AddrOfPinnedObject(); int result = SpeexEncodeApi.Speex_encoder_ctl(_encodeStateIntptr, (int)setState, intPtr); return(result); }
/// <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="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> /// 获取编码器设置 /// </summary> /// <param name="getState">目标编码器属性</param> /// <returns>编码器属性值 -1为未知请求,-2为无效参数</returns> public int GetEncode(GetCoderState getState) { int value = 0; IntPtr intPtr = GCHandle.Alloc(value, GCHandleType.Pinned).AddrOfPinnedObject(); int result = SpeexEncodeApi.Speex_encoder_ctl(_encodeStateIntptr, (int)getState, intPtr); if (result == 0) { result = Marshal.ReadInt32(intPtr); } return(result); }
/// <summary> /// 压缩音频数据 /// </summary> /// <param name="input">需要压缩的音频字节流</param> /// <returns>压缩后的Speex数据流</returns> public byte[] EncodeBase(byte[] input) { if (input == null || input.Length > 320) { throw new Exception("值不能为空且每次压缩的数据大小不能超过320个字节"); } input = SpeexHelper.PadArr(input, 320); SpeexBitsApi.Speex_bits_reset(ref _encodeSpeexBits); short[] sShort = SpeexHelper.BytesToShorts(input); //float[] sInput = SpeexHelper.ShortsToFloats(sShort); int i = SpeexEncodeApi.Speex_encode_int(_encodeStateIntptr, sShort, ref _encodeSpeexBits); int len = SpeexBitsApi.Speex_bits_nbytes(ref _encodeSpeexBits); byte[] outBuffer = new byte[len]; int outResult = SpeexBitsApi.Speex_bits_write(ref _encodeSpeexBits, outBuffer, outBuffer.Length); return(outBuffer.Take(outResult).ToArray()); }