海思库解码CCITT标准g726算法编码G726音频数据

海思库解码CCITT标准g726算法编码G726音频数据,海思库解码需要使用MEDIA_G726_XXX格式解码音频数据。MEDIA_G726_XXX格式包括以下几种:

#define MEDIA_G726_16KBPS             0x24  /* G726 16kbps forASF ... */

#define MEDIA_G726_24KBPS             0x25  /* G726 24kbps forASF ... */

#define MEDIA_G726_32KBPS             0x26  /* G726 32kbps forASF ... */

#define MEDIA_G726_40KBPS             0x27  /* G726 40kbps forASF ... */

 

//编码:使用CCITT标准g726算法将pcm编码成g726,再增加海思4字节头,将g726变成海思g726

    g726_state_t*pSate726 = (g726_state_t*)malloc(sizeof(g726_state_t));

    pSate726= g726_init(pSate726,16*1000);//16kps

 

    CStringfilePath = "";

    CStringnewlFilePath = "";

    charszFilter[] = {"PcmFiles (*.pcm)|*.pcm||"};

    CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL);

    if(dlg.DoModal() ==IDOK)

    {

        filePath= dlg.GetPathName();

        newlFilePath= filePath;

        newlFilePath.Replace(".pcm","_ff.g726_hisiWithFFMpeg");

        FILE* fpSrc = fopen(filePath.GetBuffer(filePath.GetLength()),"rb");

        FILE* fpDst = fopen(newlFilePath.GetBuffer(newlFilePath.GetLength()),"wb+");

        charszData[320] = {0};

        unsignedchar szOutData[200]= {0};

        int  nDataLen =320;

        int  nOutDataLen= 200;

        int  nReadedSize= 0;

        unsignedshort usHisiHeader[2]= {0};

        usHisiHeader[0]= 0x0100;

        int  ret = 0;

        if(fpSrc != NULL)

        {

            while(TRUE)

            {

                nReadedSize = fread(szData,sizeof(char),nDataLen,fpSrc);

                if(nReadedSize< nDataLen)

                {

                    break;

                }

                int iRet = g726_encode(pSate726,szOutData, (short*)szData, nReadedSize/2);

                nOutDataLen = iRet;

                if (nOutDataLen> 0)

                {

                    usHisiHeader[1] = (usHisiHeader[1]& 0xff00) + nOutDataLen/sizeof(unsigned short);

                    //写入hisi

                    fwrite(usHisiHeader,sizeof(unsigned short),2,fpDst);

                    //写入数据

                    int iiiii = fwrite(szOutData,1, nOutDataLen, fpDst);

                }

            }

 

            fclose(fpSrc);

            fclose(fpDst);

        }

 

    }

 

    if(pSate726 != NULL)

    {

        free(pSate726);

        pSate726= NULL;

    }

 

//解码

    //hisig726 to pcm

    CStringfilePath = "";

    CStringnewlFilePath = "";

    charszFilter[] = {"g726Files (*.g726_hisiWithFFMpeg)|*.g726_hisiWithFFMpeg||"};

    CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL);

    if(dlg.DoModal()== IDOK)

    {

        filePath= dlg.GetPathName();

        newlFilePath= filePath;

        newlFilePath.Replace(".g726_hisiWithFFMpeg","_ff2hisi.pcm");

        BOOLbRet = 0;

        CG726ADecoderg726Decoder;

        g726Decoder.DecoderInit(MEDIA_G726_16KBPS);

        FILE * fpSrc= fopen(filePath.GetBuffer(filePath.GetLength()),"rb");

        FILE* fpDst = fopen(newlFilePath.GetBuffer(newlFilePath.GetLength()),"wb+");

        char szData[104] = {0};

        char szOutData[320]= {0};

        int  nDataLen = 104;

        int  nOutDataLen = 320;

        int  nReadedSize= 0;

        unsignedshort usHisiHeader[2]= {0};

        if(fpSrc != NULL)

        {

            while(TRUE)

            {

                //读取头标记

                nDataLen = Hisi_AUDIO_HERDER_LEN;

                nReadedSize = fread(szData,sizeof(char),nDataLen,fpSrc);

                if(nReadedSize< nDataLen)

                {

                    break;

                }

                memcpy(usHisiHeader,szData,Hisi_AUDIO_HERDER_LEN);

                int nAudioFrameDataLen= (usHisiHeader[1] & 0x00ff) * sizeof(unsigned short);

                nDataLen = nAudioFrameDataLen;

                //读取音频帧数据

                nReadedSize = fread(szData+Hisi_AUDIO_HERDER_LEN,sizeof(char),nDataLen,fpSrc);

                if(nReadedSize< nDataLen)

                {

                    break;

                }

                bRet = g726Decoder.AFrameDecoder(szData,nReadedSize+Hisi_AUDIO_HERDER_LEN,szOutData,&nOutDataLen);

                if(bRet)

                {

                    fwrite(szOutData,sizeof(char),nOutDataLen,fpDst);

                }

            }

 

            fclose(fpSrc);

            fclose(fpDst);

        }

 

    }

代码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byxdaz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值