跟视频一样,对于音频的传输,往往也需要经过压缩,下面是关于海思提供的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; }
工程下载地址:点击打开链接