wav格式音频转换成flv格式音频(四)
来源:互联网 发布:centos 恢复删除文件 编辑:程序博客网 时间:2024/05/10 19:09
前三篇已经对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.csdn.net/linyanwen99/article/details/7542679
- wav格式音频转换成flv格式音频(四)
- wav格式音频转换成flv格式音频(一)
- wav格式音频转换成flv格式音频(二)
- wav格式音频转换成flv格式音频(三)
- wav格式音频转换成aac格式音频(四)
- wav格式音频转换成aac格式音频(一)
- wav格式音频转换成aac格式音频(二)
- wav格式音频转换成aac格式音频(三)
- unity wav 格式音频转换为二进制文件
- Wav 格式音频播放实例
- wince音频驱动---wav格式
- 录制wav格式的音频
- java 播放wav格式音频
- ios 使用音频队列播放amr格式转换成wav的格式,只有嘈杂声
- C# winform播放wav格式音频
- 单片机播放WAV格式音频的理解
- c++音频播放,wav格式的
- Android AudioRecord录制wav格式的音频
- 编写传递可变大小的数组引用
- hdu1023 兰塔数
- Linux 信号signal处理机制
- UBUNTU 12.04 LTS 64-bit 嵌入式开发环境建立
- Linux进程管理命令详解
- wav格式音频转换成flv格式音频(四)
- MSSSQL变量加引号
- 转载--大内高手—常见内存错误
- ubuntu12.04找不到software source?!
- MD5加密
- BACKUP RECOVERY AREA与BACKUP RECOVERY FILES;的区别
- Wijmo 更优美的jQuery UI部件集:服务器端Grid魔法
- Sql server中Collation conflict问题
- Win32串口编程