---
title: SILK
description: "将SILK格式音频数据流解码成PCM格式音频数据流。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2200/accel/kunpengaccel_hmpp_06_0212.html
sourcePath: /source/zh/kunpengboostkithistory/2200/accel/kunpengaccel_hmpp_06_0212.html
indexId: 222becca1c361b85fd0a524d4dac10f0a185dd0dc3467c3b702130a5db2357fd75
---
# SILK

将SILK格式音频数据流解码成PCM格式音频数据流。

输入数据流支持Silk协议的常见频率（8kHz、12kHz、16kHz、24kHz），如非常见的频率，请先调用HMPP重采样函数，对函数进行频率转换；针对丢包数据流的解码处理时，需要保证输入数据流与丢包率（参数lossProb）的一致性，当数据流存在丢包情况时，因存在模拟丢包过程，解码结果可能与预期有差别。

该函数调用流程如下：

1. 获取解码需要申请的内存大小dstBufLen。
2. 调用HMPPA_Silk_Init_8u16s初始化HmppaSilkDecodePolicy_16s结构体，并依据decodeoutSampleRate的值初始化结构体。
3. 调用主函数HMPPA_Silk_Decode_8u16s进行解码。
4. 最后调用HMPPA_Silk_Release_8u16s释放HmppaSilkDecodePolicy_16s结构体所包含的内存。

函数接口声明如下：

- 获取解码需要申请的内存大小：
  HmppResult HMPPA_Silk_GetDecodeDstBufLen_8u16s(int32_t len, int32_t *dstBufLen);

- 初始化函数：
  HmppResult HMPPA_Silk_DecodeInit_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_DecodeRelease_8u16s(HmppaSilkDecodePolicy_16s* policy);


#### 参数

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| src | 指向待解码的SILK码流指针。 | 非空。 | 输入 |
| len | 待解码SILK码流长度（以字节为单位）。 | (0, INT\_MAX]。 | 输入 |
| dst | 指向目的向量的指针。 | 非空。 | 输出 |
| policy | 特殊结构体的指针。 | 非空。 | 输入、输出 |
| decodeoutSampleRate | 期望输出的码率，单位Hz。 | 如果输入为0，默认为24000Hz，其他输入以实际输入为准，请用户保证输入的码率有实际意义（8000/12000/16000/24000）。 | 输入 |
| bytesConsumed | 指向实际解码消耗的长度（以字节为单位）。 | 输入：空或者非空。 输出：当输入为空，不输出；当输入为非空时，输出范围为[0, len]。 | 输出 |
| bytesDecoded | 指向实际解码输出的长度（以字节为单位）。 | 输入：空或者非空。 输出：当输入为空，不输出；当输入为非空时，输出范围为[0, 理论解码len后输出的字节数]。 | 输出 |
| 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];
int32_t dstLen;
HMPPA_Silk_GetDecodeDstBufLen_8u16s(AUDIO_INBUF_SIZE, &dstLen);
int16_t *outBuf = HMPPS_Malloc_16s(dstLen);
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_DecodeInit_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("SUCCESS: 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_DecodeRelease_8u16s(policy);
HMPP_Free(outBuf);
fclose(outFile);
fclose(inFile);
return 0;
}
```

运行结果：

```
INFO: Get end of the file
SUCCESS: HMPPA_Silk_Decode_8u16s : 0
```
