美文网首页ios-相关
iOS将PCM数据文件转换为WAV文件

iOS将PCM数据文件转换为WAV文件

作者: OlsonXia | 来源:发表于2016-06-13 19:03 被阅读3863次

最近学习写wav文件,搞了很久,踩了不少坑。将PCM数据文件转换为WAV文件其实就是在PCM数据前加上WAV的头。只需要设置好码率,声道数,采样位数就可以了。从别人移植过来一段C代码,发现在iOS各种设备平台上还有兼容性的问题,简单的修改了一下,经过几次测试,发现没什么问题了,分享给大家。

//wav头的结构如下所示:

typedef  struct  {

char        fccID[4];

int32_t      dwSize;

char        fccType[4];

} HEADER;

typedef  struct  {

char        fccID[4];

int32_t      dwSize;

int16_t      wFormatTag;

int16_t      wChannels;

int32_t      dwSamplesPerSec;

int32_t      dwAvgBytesPerSec;

int16_t      wBlockAlign;

int16_t      uiBitsPerSample;

}FMT;

typedef  struct  {

char        fccID[4];

int32_t      dwSize;

}DATA;

int convertPcm2Wav(char *src_file, char *dst_file, int channels, int sample_rate)

{

int bits = 16;

//以下是为了建立.wav头而准备的变量

HEADER  pcmHEADER;

FMT  pcmFMT;

DATA  pcmDATA;

unsigned  short  m_pcmData;

FILE  *fp,*fpCpy;

if((fp=fopen(src_file,  "rb"))  ==  NULL) //读取文件

{

printf("open pcm file %s error\n", src_file);

return -1;

}

if((fpCpy=fopen(dst_file,  "wb+"))  ==  NULL) //为转换建立一个新文件

{

printf("create wav file error\n");

return -1;

}

//以下是创建wav头的HEADER;但.dwsize未定,因为不知道Data的长度。

strncpy(pcmHEADER.fccID,"RIFF",4);

strncpy(pcmHEADER.fccType,"WAVE",4);

fseek(fpCpy,sizeof(HEADER),1); //跳过HEADER的长度,以便下面继续写入wav文件的数据;

//以上是创建wav头的HEADER;

if(ferror(fpCpy))

{

printf("error\n");

}

//以下是创建wav头的FMT;

pcmFMT.dwSamplesPerSec=sample_rate;

pcmFMT.dwAvgBytesPerSec=pcmFMT.dwSamplesPerSec*sizeof(m_pcmData);

pcmFMT.uiBitsPerSample=bits;

strncpy(pcmFMT.fccID,"fmt  ", 4);

pcmFMT.dwSize=16;

pcmFMT.wBlockAlign=2;

pcmFMT.wChannels=channels;

pcmFMT.wFormatTag=1;

//以上是创建wav头的FMT;

fwrite(&pcmFMT,sizeof(FMT),1,fpCpy); //将FMT写入.wav文件;

//以下是创建wav头的DATA;  但由于DATA.dwsize未知所以不能写入.wav文件

strncpy(pcmDATA.fccID,"data", 4);

pcmDATA.dwSize=0; //给pcmDATA.dwsize  0以便于下面给它赋值

fseek(fpCpy,sizeof(DATA),1); //跳过DATA的长度,以便以后再写入wav头的DATA;

fread(&m_pcmData,sizeof(int16_t),1,fp); //从.pcm中读入数据

while(!feof(fp)) //在.pcm文件结束前将他的数据转化并赋给.wav;

{

pcmDATA.dwSize+=2; //计算数据的长度;每读入一个数据,长度就加一;

fwrite(&m_pcmData,sizeof(int16_t),1,fpCpy); //将数据写入.wav文件;

fread(&m_pcmData,sizeof(int16_t),1,fp); //从.pcm中读入数据

}

fclose(fp); //关闭文件

pcmHEADER.dwSize = 0;  //根据pcmDATA.dwsize得出pcmHEADER.dwsize的值

rewind(fpCpy); //将fpCpy变为.wav的头,以便于写入HEADER和DATA;

fwrite(&pcmHEADER,sizeof(HEADER),1,fpCpy); //写入HEADER

fseek(fpCpy,sizeof(FMT),1); //跳过FMT,因为FMT已经写入

fwrite(&pcmDATA,sizeof(DATA),1,fpCpy);  //写入DATA;

fclose(fpCpy);  //关闭文件

return 0;

}

相关文章

  • iOS将PCM数据文件转换为WAV文件

    最近学习写wav文件,搞了很久,踩了不少坑。将PCM数据文件转换为WAV文件其实就是在PCM数据前加上WAV的头。...

  • [kalid] pcm2wav

    20180827 qzd pcm文件转wav文件时,主要是在pcm文件加入wav的头。wav的文件头包含wav标示...

  • 录音程序

    1.获取pcm文件: 2.pcm转wav 3.录音转为pcm再转为wav:

  • PCM文件转wav文件

    PCM是采样的原始音频数据, 是无压缩的原始数据, 给pcm添加wav的文件头, 就是wav文件, 所以wav也是...

  • wav转pcm、去掉wav文件头

  • [转]iOS

    iOS的一些有用的文章,统一搜集到这里,方便查阅。 音频 iOS音频播放 系列 WAV文件格式终极解析 pcm文件...

  • PCM转WAV

    一、WAVE 文件格式介绍 WAVE 文件是基于 Microsoft RIFF 标准的文件格式。RIFF 格式文件...

  • PCM转WAV

    录制PCM之后,我在命令行播放成功之后,也用了代码去播放,最终也都是成功的,然后我就想能否直接用播放器直接播放呢?...

  • PCM转WAV

    PCM存在问题 PCM是音频文件元数据,并不包含采样率、声道数、位深度等参数。播放器不知道相关参数无法直接读取 W...

  • WAV和PCM的关系和区别

    什么是WAV和PCM? WAV:wav是一种无损的音频文件格式,WAV符合 PIFF(Resource Inter...

网友评论

    本文标题:iOS将PCM数据文件转换为WAV文件

    本文链接:https://www.haomeiwen.com/subject/riiydttx.html