音频重采样(海思3536)

一、操作接口

1、启用 AO 重采样
  • HI_S32 HI_MPI_AO_EnableReSmp(AUDIO_DEV AoDevId, AO_CHN AoChn,AUDIO_SAMPLE_RATE_E enInSampleRate);
    • AoDevId:音频设备号。
      • 取值范围:
        • 音频输入设备 ID:0
        • 音频输出设备 ID:[0,1,2]
    • AoChn:音频输出通道号。支持的通道范围由 AO 设备属性中的最大通道个数 u32ChnCnt 决定(即在初始化的时候配置的值)
    • enInSampleRate:音频重采样的输入采样率。
    • 返回值:
      • 成功:0
      • 错误:其他,值为错误码
2、禁用 AO 重采样。
  • HI_S32 HI_MPI_AO_DisableReSmp(AUDIO_DEV AoDevId, AO_CHN AoChn);
    • AoDevId:音频设备号。
      • 取值范围:
        • 音频输入设备 ID:0
        • 音频输出设备 ID:[0,1,2]
    • AoChn:音频输出通道号。支持的通道范围由 AO 设备属性中的最大通道个数 u32ChnCnt 决定(即在初始化的时候配置的值)
    • 返回值:
      • 成功:0
      • 错误:其他,值为错误码

二、使用方法:

1、注意事项
  • HI_MPI_AO_EnableReSmp应该在启用 AO 通道之后(HI_MPI_AO_Enable),绑定 AO 通道之前(HI_MPI_SYS_Bind),调用此接口启用重采样功能。
  • 允许重复启用重采样功能,但必须保证后配置的重采样输入采样率与之前配置的重采样输入采样率一样。
2、例子
//使能Ao
HI_S32 SAMPLE_COMM_AUDIO_StartAo(AUDIO_DEV AoDevId, HI_S32 s32AoChnCnt,
                                 AIO_ATTR_S* pstAioAttr, AUDIO_SAMPLE_RATE_E enInSampleRate, HI_BOOL bResampleEn, HI_VOID* pstAoVqeAttr, HI_U32 u32AoVqeType)
{
    HI_S32 i;
    HI_S32 s32Ret;

    if (SAMPLE_AUDIO_HDMI_AO_DEV == AoDevId)
    {
        #ifdef HI_ACODEC_TYPE_HDMI 
        
        pstAioAttr->u32ClkSel = 0;
        
        SAMPLE_COMM_AUDIO_StartHdmi(pstAioAttr);
        
        #endif
    }

    if (pstAioAttr->u32ClkChnCnt == 0)
    {
        pstAioAttr->u32ClkChnCnt = pstAioAttr->u32ChnCnt;
    }

    s32Ret = HI_MPI_AO_SetPubAttr(AoDevId, pstAioAttr);
    if (HI_SUCCESS != s32Ret)
    {
        printf("%s: HI_MPI_AO_SetPubAttr(%d) failed with %#x!\n", __FUNCTION__, \
               AoDevId, s32Ret);
        return HI_FAILURE;
    }
    //使能Ao
    s32Ret = HI_MPI_AO_Enable(AoDevId);
    if (HI_SUCCESS != s32Ret)
    {
        printf("%s: HI_MPI_AO_Enable(%d) failed with %#x!\n", __FUNCTION__, AoDevId, s32Ret);
        return HI_FAILURE;
    }

    for (i = 0; i < s32AoChnCnt; i++)
    {
        s32Ret = HI_MPI_AO_EnableChn(AoDevId, i);
        if (HI_SUCCESS != s32Ret)
        {
            printf("%s: HI_MPI_AO_EnableChn(%d) failed with %#x!\n", __FUNCTION__, i, s32Ret);
            return HI_FAILURE;
        }
        //重采样
        if (HI_TRUE == bResampleEn)
        {
            printf("AoDevId=%d, s32AoChnCnt=%d, enInSampleRate=%d\n", AoDevId, i, enInSampleRate);
            s32Ret = HI_MPI_AO_DisableReSmp(AoDevId, i);
            s32Ret |= HI_MPI_AO_EnableReSmp(AoDevId, i, enInSampleRate);
            if (HI_SUCCESS != s32Ret)
            {
                printf("%s: HI_MPI_AO_EnableReSmp(%d,%d) failed with %#x!\n", __FUNCTION__, AoDevId, i, s32Ret);
                return HI_FAILURE;
            }
        }

		if (NULL != pstAoVqeAttr)
        {
			HI_BOOL bAoVqe = HI_TRUE;
			switch (u32AoVqeType)
            {
				case 0:
                    s32Ret = HI_SUCCESS;
					bAoVqe = HI_FALSE;
                    break;
                case 1:
                    s32Ret = HI_MPI_AO_SetVqeAttr(AoDevId, i, (AO_VQE_CONFIG_S *)pstAoVqeAttr);
                    break;
                default:
                    s32Ret = HI_FAILURE;
                    break;
            }
            
            if (s32Ret)
            {
                printf("%s: SetAoVqe%d(%d,%d) failed with %#x\n", __FUNCTION__, u32AoVqeType, AoDevId, i, s32Ret);
                return s32Ret;
            }
			
		    if (bAoVqe)
            {
                s32Ret = HI_MPI_AO_EnableVqe(AoDevId, i);
	            if (s32Ret)
	            {
	                printf("%s: HI_MPI_AI_EnableVqe(%d,%d) failed with %#x\n", __FUNCTION__, AoDevId, i, s32Ret);
	                return s32Ret;
	            }
            }
        }
    }

    return HI_SUCCESS;
}

HI_S32 SAMPLE_COMM_AUDIO_AoBindAdec(AUDIO_DEV AoDev, AO_CHN AoChn, ADEC_CHN AdChn)
{
    MPP_CHN_S stSrcChn,stDestChn;

    stSrcChn.enModId = HI_ID_ADEC;
    stSrcChn.s32DevId = 0;
    stSrcChn.s32ChnId = AdChn;
    stDestChn.enModId = HI_ID_AO;
    stDestChn.s32DevId = AoDev;
    stDestChn.s32ChnId = AoChn;
    
    return HI_MPI_SYS_Bind(&stSrcChn, &stDestChn); 
}


int main()
{
    ......
    
     s32Ret = SAMPLE_COMM_AUDIO_StartAo(AoDev, stAioAttr.u32ChnCnt, &stAioAttr, AUDIO_SAMPLE_RATE_16000, HI_TRUE, NULL, 0);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_DBG(s32Ret);
        return HI_FAILURE;
    }

    s32Ret = SAMPLE_COMM_AUDIO_AoBindAdec(AoDev, AoChn, AdChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_DBG(s32Ret);
        return HI_FAILURE;
    }
    
    ......
}

三、重采样结果

1、在demo中测试
  • 播放用的音频为16K的采样率
音频重采样的输入采样率 输出采样率 音频效果
16K 16K 无法进行重采样
32K 16K 声音速度变快
16K 8K 声音速度正常,音量变低
8K 16K 声音速度变慢
16K 32K 声音正常
32K 48K 声音变快
2、使用解码器的程序测试
  • 播放用的音频为8K的采样率
音频重采样的输入采样率 输出采样率 音频效果
8K 8K 无法进行重采样,声音播放正常
16K 8K 声音速度变快,变尖,卡顿,proc/umap/ao文件中的空buff每秒增加13
32K 8K 声音速度变快,变尖,卡顿,proc/umap/ao文件中的空buff每秒增加19~20
48K 8K 声音速度变快,变尖,卡顿,proc/umap/ao文件中的空buff每秒增加21

你可能感兴趣的:(音视频,音频,海思,HI3536)