您的位置:首页 > 其它

PCM数据转WAV文件

2017-12-09 13:54 726 查看


int simplest_pcm16le_to_wave(const char *pcmpath, int channels, int sample_rate, const char *wavepath)
{
typedef struct WAVE_HEADER{
char    fccID[4];       //内容为""RIFF
unsigned long dwSize;   //最后填写,WAVE格式音频的大小
char    fccType[4];     //内容为"WAVE"
}WAVE_HEADER;

typedef struct WAVE_FMT{
char    fccID[4];          //内容为"fmt "
unsigned long  dwSize;     //内容为WAVE_FMT占的字节数,为16
unsigned short wFormatTag; //如果为PCM,改值为 1
unsigned short wChannels;  //通道数,单通道=1,双通道=2
unsigned long  dwSamplesPerSec;//采用频率
unsigned long  dwAvgBytesPerSec;/* ==dwSamplesPerSec*wChannels*uiBitsPerSample/8 */
unsigned short wBlockAlign;//==wChannels*uiBitsPerSample/8
unsigned short uiBitsPerSample;//每个采样点的bit数,8bits=8, 16bits=16
}WAVE_FMT;

typedef struct WAVE_DATA{
char    fccID[4];       //内容为"data"
unsigned long dwSize;   //==NumSamples*wChannels*uiBitsPerSample/8
}WAVE_DATA;

int bits = 16;

WAVE_HEADER pcmHEADER;
WAVE_FMT    pcmFMT;
WAVE_DATA   pcmDATA;

unsigned short m_pcmData;
FILE *fp, *fpout;

fp = fopen(pcmpath, "rb+");
if (fp == NULL)
{
printf("Open pcm file error.\n");
return -1;
}
fpout = fopen(wavepath, "wb+");
if (fpout == NULL)
{
printf("Create wav file error.\n");
return -1;
}

/* WAVE_HEADER */
memcpy(pcmHEADER.fccID, "RIFF", strlen("RIFF"));
memcpy(pcmHEADER.fccType, "WAVE", strlen("WAVE"));
fseek(fpout, sizeof(WAVE_HEADER), SEEK_CUR);   //1=SEEK_CUR  ??????

/* WAVE_FMT */
#if 1
memcpy(pcmFMT.fccID, "fmt ", strlen("fmt "));
pcmFMT.dwSize = 16;
pcmFMT.wFormatTag = 1;
pcmFMT.wChannels = 1;
pcmFMT.dwSamplesPerSec = sample_rate;
pcmFMT.uiBitsPerSample = bits;
pcmFMT.dwAvgBytesPerSec = pcmFMT.dwSamplesPerSec*pcmFMT.wChannels*pcmFMT.uiBitsPerSample / 8;
pcmFMT.wBlockAlign = pcmFMT.wChannels*pcmFMT.uiBitsPerSample / 8;
fwrite(&pcmFMT, sizeof(WAVE_FMT), 1, fpout);  //????????????
#endif

/* WAVE_DATA */
memcpy(pcmDATA.fccID, "data", strlen("data"));
pcmDATA.dwSize = 0;
fseek(fpout, sizeof(WAVE_DATA), SEEK_CUR);//????????????????????????

fstream readData(pcmpath, ios::in);
vector<double>pcmData;
double dPCMData = 0.0;
if (readData.is_open())
{
string temp = "";
while (getline(readData, temp))
{
if (temp.length() > 1)
{
pcmData.push_back(atof(temp.c_str()));
dPCMData = atof(temp.c_str());
pcmDATA.dwSize += 2;
if (dPCMData < 0)
{
m_pcmData = dPCMData * 32768;
}
else
{
m_pcmData = dPCMData * 32767;
}
fwrite(&m_pcmData, sizeof(unsigned short), 1, fpout);
}
}
}

//fread(&m_pcmData, sizeof(unsigned short), 1, fp);
//while (!feof(fp))
//{
//	pcmDATA.dwSize += 2;
//	fwrite(&m_pcmData, sizeof(unsigned short), 1, fpout);
//	fread(&m_pcmData, sizeof(unsigned short), 1, fp);
//}

pcmHEADER.dwSize = 44 + pcmDATA.dwSize;
rewind(fpout);
fwrite(&pcmHEADER, sizeof(WAVE_HEADER), 1, fpout);
fseek(fpout, sizeof(WAVE_FMT), SEEK_CUR);
fwrite(&pcmDATA, sizeof(WAVE_DATA), 1, fpout);

fclose(fp);
fclose(fpout);

return 0;
}


PCM数据格式:http://blog.csdn.net/ownwell/article/details/8114121/

视音频数据处理入门:PCM音频采样数据处理:http://blog.csdn.net/leixiaohua1020/article/details/50534316
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: