SILK
将SILK格式音频数据流解码成PCM格式音频数据流。
输入数据流支持Silk协议的常见频率(8kHZ、12kHZ、16kHZ、24kHZ),如非常见的频率,请先调用HMPP重采样函数,对函数进行频率转换;针对丢包数据流的解码处理时,需要保证输入数据流与丢包率(参数lossProb)的一致性,当数据流存在丢包情况时,因存在模拟丢包过程,解码结果可能与预期有差别。
该函数调用流程如下:
- 调用HMPPA_Silk_Init_8u16s初始化HmppaSilkDecodePolicy_16s结构体,并依据decodeoutSampleRate的值初始化结构体。
- 调用主函数HMPPA_Silk_Decode_8u16s进行解码。
- 最后调用HMPPA_Silk_Release_8u16s释放HmppaSilkDecodePolicy_16s结构体所包含的内存。
函数接口声明如下:
- 初始化函数:
HmppResult HMPPA_Silk_Init_8u16s(HmppaSilkDecodePolicy_16s** policy, int32_t decodeoutSampleRate);
- 解码函数:
HmppResult HMPPA_Silk_Decode_8u16s(const uint8_t *src, int32_t len, int16_t *dst, HmppaSilkDecodePolicy_16s *policy, int32_t *bytesConsumed, int64_t *bytesDecoded, float lossProb);
- 释放函数:
HmppResult HMPPA_Silk_Release_8u16s(HmppaSilkDecodePolicy_16s* policy);
参数
参数名 |
描述 |
取值范围 |
输入/输出 |
---|---|---|---|
src |
指向待解码的SILK码流指针。 |
非空。 |
输入 |
len |
待解码SILK码流长度(以字节为单位)。 |
(0, INT_MAX]。 |
输入 |
dst |
指向目的向量的指针。 |
非空。 |
输出 |
policy |
特殊结构体的指针。 |
非空。 |
输入、输出 |
decodeoutSampleRate |
期望输出的码率,单位Hz。 |
如果输入为0,默认为24000Hz,其他输入以实际输入为准,请用户保证输入的码率有实际意义(8000/12000/16000/24000)。 |
输入 |
bytesConsumed |
指向实际解码消耗的长度(以字节为单位)。 |
|
输出 |
bytesDecoded |
指向实际解码输出的长度(以字节为单位)。 |
|
输出 |
lossProb |
模拟丢包的百分比。 |
[0,100]。无丢包情况时,设置为0。 |
输入 |
返回值
- 成功:返回HMPP_STS_NO_ERR。
- 失败:返回错误码。
错误码
错误码 |
描述 |
---|---|
HMPP_STS_NULL_PTR_ERR |
src、dst、policy中存在空指针。 |
HMPP_STS_SIZE_ERR |
len小于或者等于0或者len的长度与src中的有效帧长不匹配。 |
HMPP_STS_MALLOC_FAILED |
申请内存失败。 |
HMPP_STS_FRAME_ERR |
解码帧错误。 |
示例
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "hmpp.h" #define AUDIO_INBUF_SIZE 20480 int main(int argc, char **argv) { const char *outFileName, *inFileName; int32_t len; FILE *inFile, *outFile; uint8_t inBuf[AUDIO_INBUF_SIZE]; int16_t *outBuf = HMPPS_Malloc_16s(AUDIO_INBUF_SIZE * 8); uint8_t *data; int32_t dataSize; int32_t bytesConsumered = 0; int64_t bytesDecoded = 0; int32_t APIFsHz = 24000; if (argc <= 2) { printf("Usage: %s <input file> <output file>\n", argv[0]); exit(0); } inFileName = argv[1]; outFileName = argv[2]; inFile = fopen(inFileName, "rb"); if (!inFile) { printf("Could not open %s\n", inFileName); exit(1); } outFile = fopen(outFileName, "wb"); if (!outFile) { printf("Could not open %s\n", outFileName); exit(1); } HmppaSilkDecodePolicy_16s *policy; HmppResult result = HMPPA_Silk_Init_8u16s(&policy, APIFsHz); if (result != HMPP_STS_NO_ERR){ printf("HMPPA_Silk_Init_8u16s return : %d\n", result); } while (1){ dataSize = fread(inBuf, 1, AUDIO_INBUF_SIZE, inFile); if (dataSize <= 0) { printf("INFO: Get end of the file\n"); break; } result = HMPPA_Silk_Decode_8u16s(inBuf, dataSize, outBuf, policy, &bytesConsumered, &bytesDecoded,0.0f); if (result == HMPP_STS_NO_ERR) { printf("SUCESS: HMPPA_Silk_Decode_8u16s : %d\n", result); fwrite(outBuf, 1, bytesDecoded, outFile); } else { printf("ERROR: HMPPA_Silk_Decode_8u16s : %d\n", result); break; } } HMPPA_Silk_Release_8u16s(policy); HMPP_Free(outBuf); fclose(outFile); fclose(inFile); return 0; }
运行结果:
INFO: Get end of the file SUCESS: HMPPA_Silk_Decode_8u16s : 0