• C++ pcm音频裸流的压缩和解码


    跟视频一样,对于音频的传输,往往也需要经过压缩,下面是关于海思提供的PCM音频裸流文件压缩和解码库的运用,对比一个文件与其压缩、解码操作后的数据,可以明显的发现PCM->ADPCM的音频压缩过程是有损的。关于文件的对比,本人使用的是BCompare 这个软件,绝对是程序员必备的神器啊!如果没有的童鞋建议大家下来玩玩。下载地址:点击打开链接

    由于是用海思提供的压缩和解码库,所以其实并不需要做什么复杂的事,只是简单的写几句调用代码就完事了。配置反倒是比较麻烦的事,所以在下面贴出代码后直接给出本人配置好的工程链接。

     

    压缩,从PCM到ADPCM

    #include "stdafx.h"
    #include "hi_voice_api.h"
    
    HI_S32 VoiceEngineState[0x100];
    
    #define VOICE_FRAME_SIZE   160 
    
    int _tmain(int argc, _TCHAR* argv[])//压缩,从pcm到adpcm,这种压缩是有损的
    {
    	HI_S32 frame;
    	HI_S16 coder, len, frame_size;
    	HI_S16 in_enc_pcmbuf[HI_VOICE_MAX_FRAME_SIZE];     //encoder input
    	HI_S16 ou_enc_unpacked[HI_VOICE_MAX_FRAME_SIZE];   //encoder output
    	coder = 35;
    
    	FILE *fp_in = NULL, *fp_out = NULL;
    	fopen_s(&fp_in, "paomo.pcm", "rb");
    	fopen_s(&fp_out,"enpaomo.adpcm", "wb");
    
    	frame_size = 2 * VOICE_FRAME_SIZE;
    	if (coder == ADPCM_IMA)
    		frame_size += 1;
    
    	frame = 0;
    	HI_VOICE_EncReset((HI_VOID*)VoiceEngineState, coder);//压缩编码器复位
    	while (fread(in_enc_pcmbuf, sizeof(HI_S16), frame_size, fp_in) == (HI_U32)frame_size)
    	{
    		HI_VOICE_EncodeFrame((HI_VOID*)VoiceEngineState, in_enc_pcmbuf, ou_enc_unpacked, frame_size);//压缩编码
    		fwrite(ou_enc_unpacked, sizeof(HI_S16), 2 + ou_enc_unpacked[1], fp_out);//压缩后数据写入文件
    		frame++;
    		printf("encoding %d frame
    ",frame);
    	}
    	fclose(fp_in);
    	fclose(fp_out);
    
    	return 0;
    }
    

    解码,从ADPCM到PCM

    #include "stdafx.h"
    #include "hi_voice_api.h"
    
    HI_S32 VoiceEngineState[0x100];
    
    int _tmain(int argc, _TCHAR* argv[])//解码,从adpcm到pcm
    {
    	HI_S16 ou_dec_pcmbuf[HI_VOICE_MAX_FRAME_SIZE];     //decoder output
    	HI_S16 in_enc_pcmbuf[HI_VOICE_MAX_FRAME_SIZE];     //encoder input
    	HI_S16 ou_enc_unpacked[HI_VOICE_MAX_FRAME_SIZE];   //encoder output
    	HI_S16 coder, len;
    	HI_S32 frame;
    
    	FILE *fp_in = NULL, *fp_out = NULL;
    	fopen_s(&fp_in, "enpaomo.adpcm", "rb");
    	fopen_s(&fp_out,"depaomo.pcm", "wb");
    
    	coder = 35;
    	frame = 0;
    
    	HI_VOICE_DecReset((HI_VOID*)VoiceEngineState, coder);//解码器复位
    	while (fread(&ou_enc_unpacked[0], sizeof(HI_S16), 2, fp_in) == 2)
    	{
    		len = (ou_enc_unpacked[1] & 0x00ff);
    		if (fread(&ou_enc_unpacked[2], sizeof(HI_S16), len, fp_in) != (HI_U32)(len))
    		{
    			printf("
    file end!
    ");
    			break;
    		}
    		HI_VOICE_DecodeFrame((HI_VOID*)VoiceEngineState, ou_enc_unpacked, ou_dec_pcmbuf, &len);//解码
    		fwrite(ou_dec_pcmbuf, sizeof(HI_S16), len, fp_out);//解码后写入文件
    		frame++;
    		printf("decoding %d frame
    ",frame);
    	}
    	fclose(fp_in);
    	fclose(fp_out);
    	return 0;
    }
    

    工程下载地址:点击打开链接


  • 相关阅读:
    多CPU构建镜像
    docker构建goweb多架构镜像混合部署
    Linux 删除指定日期之外的文件 雾中的
    tkMybatis使用详解
    JAVA实现调用Linux
    springboot整合minio
    关于mybatisplus最全知识总结
    iOS开发之权限申请说明key
    MySQL操作XML格式字段
    Vue 隐藏滚动条
  • 原文地址:https://www.cnblogs.com/weixinhum/p/3916685.html
Copyright © 2020-2023  润新知