中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

SILK

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

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

该函数调用流程如下:

  1. 调用HMPPA_Silk_Init_8u16s初始化HmppaSilkDecodePolicy_16s结构体,并依据decodeoutSampleRate的值初始化结构体。
  2. 调用主函数HMPPA_Silk_Decode_8u16s进行解码。
  3. 最后调用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

指向实际解码消耗的长度(以字节为单位)。

  • 输入:空或者非空。
  • 输出:当输入为空,不输出;当输入为非空时,输出范围为[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];
    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