wav格式音频转换成flv格式音频(四)

本文介绍如何将AMR格式音频转换为FLV,重点在于转换流程及关键的while循环,其中涉及AMR数据编码为WAV,再封装成FLV格式的过程。转换过程中使用了D_IF_decode函数进行编码,并详细描述了各步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前三篇已经对wav音频格式转换成flv格式做了一些较为详细的说明,这一篇把最后一部分写完,转换的流程为,先把amr的转化成wav格式,再把wav格式封装成

flv格式,本篇关键部分是while循环里面的部分,其他部分可以略过,其中函数D_IF_decode(st, serial, synth16, _good_frame);的作用是把一帧amr数据编码成对应的一帧wav格式数据,调用该函数需要一些相关amr音频的编解码库,需要的朋友可以上网找找

int amrToWav(const char* amrData,int amrDataLen,char* wavData){
 /*
  * 将长为amrDataLen个字节的AMR音频数据amrData,转换为WAV,写入wavData
  * 成功返回WAV数据的字节数,失败返回-1
  */
 UWord8 serial[NB_SERIAL_MAX];
 Word8 synth8[L_FRAME16k*2];
 Word16 synth16[L_FRAME16k];
 Word16 mode = 0;
 Word16 readLen = 0;
 Word16 writeLen = L_FRAME16k * 2;
 Word32 readByteSum = 0;
 Word32 writeByteSum = 0;
 Word16 i,j;
 char* tempPt = synth8;
 //////////////////////
 unsigned char flvPreviousTagSizeTemp[10];
 unsigned char* flvPreviousTagNum = flvPreviousTagSizeTemp;
 unsigned char flvTagDataFirstByteTemp[10];
 unsigned char* flvTagDataFirstByte = flvTagDataFirstByteTemp;
 unsigned char flvHeaderTemp[50];
 unsigned char* flvHeader = flvHeaderTemp;
 unsigned char flvTagHeaderTemp[50];
 unsigned char* flvTagHeader = flvTagHeaderTemp;
 Word32 flvHeaderSize = 0;
 Word32 flvTagHeaderSize = 0;
 Word32 flvTagDataFirstByteSize = 0;
 Word32 flvprevioustagsize = 0;
 //////////////////////
 while (readByteSum < amrDataLen) {
  serial[0] = *(amrData + readByteSum);
#ifdef IF2
  mode = (Word16)(serial[0] >> 4);
#else
  mode = (Word16) ((serial[0] >> 3) & 0x0F);
#endif
  if(mode >= 0 && mode <= 8){
   readLen = block_size[mode] - 1;
   for (i = 1; i <= readLen; i++) {
    serial[i] = *(amrData + i + readByteSum);
   }
   frame++;
   readByteSum += (readLen + 1);
//            fprintf(stderr, " Decoding frame: %d,%d\r", frame,writeByteSum);
   D_IF_decode(st, serial, synth16, _good_frame);
   tempPt = reinterpret_cast<char*>(synth16);
   /**
    * TODO
    * 修改timestamp
    */
   if(isFirstTagHdr){
    isFirstTagHdr = false;
   }else{
    calculateTimeStamp(timeStamp);
   }

   flvTagHeaderSize = getFlvTagHeader(flvTagHeader,0);//获取tag header
   for(j = 0;j < flvTagHeaderSize;j++){
    *(wavData + j + writeByteSum) = *(flvTagHeader + j);//把tag header写入flv文件
   }
   writeByteSum += flvTagHeaderSize;

   flvTagDataFirstByteSize = getFlvTagDataFirstByte(flvTagDataFirstByte,0);//tagData的firstByte
   for(j = 0;j < flvTagDataFirstByteSize;j++){
    *(wavData + j + writeByteSum) = *(flvTagDataFirstByte + j);//把tagData的firstByte写入flv
   }
   writeByteSum += flvTagDataFirstByteSize;

   for (j = 0; j < writeLen; j++) {
    *(wavData + j + writeByteSum) = *(tempPt + j);
   }
   writeByteSum += writeLen;

   flvprevioustagsize = getPreviousTagSize(flvPreviousTagNum,0);//previousTagSize
   for(j = 0;j < flvprevioustagsize;j++){
    *(wavData + j + writeByteSum) = *(flvPreviousTagNum + j);
   }
   writeByteSum += flvprevioustagsize;
   fprintf(stderr, "previous tag size: %d\r", writeByteSum);
  }
 }
 return writeByteSum;
}

PS:初写文章,文笔生涩之处,各位请见谅,若有疑问或者交流的,可加本人YY号:301558660

转载请注明出处:山水间博客,http://blog.youkuaiyun.com/linyanwen99/article/details/7542679

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值