http://ikinglai.blog.51cto.com/6220785/1224481
#include <stdlib.h>
#include "WaveHeader.h"
// wav头部结构体
struct wave_header {
char riff[4];
unsignedlong fileLength;
char wavTag[4];
char fmt[4];
unsignedlong size;
unsignedshort formatTag;
unsignedshort channel;
unsignedlong sampleRate;
unsignedlong bytePerSec;
unsignedshort blockAlign;
unsignedshort bitPerSample;
char data[4];
unsignedlong dataSize;
};
void *createWaveHeader(int fileLength, short channel, int sampleRate, short bitPerSample)
{
structwave_header *header = malloc(sizeof(structwave_header));
if (header == NULL) {
return NULL;
}
// RIFF
header->riff[0] = 'R';
header->riff[1] = 'I';
header->riff[2] = 'F';
header->riff[3] = 'F';
// file length
header->fileLength = fileLength + (44 - 8);
// WAVE
header->wavTag[0] = 'W';
header->wavTag[1] = 'A';
header->wavTag[2] = 'V';
header->wavTag[3] = 'E';
// fmt
header->fmt[0] = 'f';
header->fmt[1] = 'm';
header->fmt[2] = 't';
header->fmt[3] = ' ';
header->size = 16;
header->formatTag = 1;
header->channel = channel;
header->sampleRate = sampleRate;
header->bitPerSample = bitPerSample;
header->blockAlign = (short)(header->channel * header->bitPerSample / 8);
header->bytePerSec = header->blockAlign * header->sampleRate;
// data
header->data[0] = 'd';
header->data[1] = 'a';
header->data[2] = 't';
header->data[3] = 'a';
// data size
header->dataSize = fileLength;
return header;
}
使用示例:
// fileLength 原始录音数据长度
// 1 表示 单声道
// 16000 采样率
// 16 表示每个采样点是16个bit
void *header = createWaveHeader(fileLength, 1, 16000, 16);
// 使用。。。。
free(header);
package com.example.pcm2wave;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class WaveHeader {
private char fileID[] = { 'R', 'I', 'F', 'F' };
private int fileLength;
private char wavTag[] = { 'W', 'A', 'V', 'E' };
private char fmtHdrID[] = { 'f', 'm', 't', ' ' };
private int fmtHdrLeth = 16;
private short formatTag = 1;
public short channels = 1;
public short sampleRate = 16000;
public short bitsPerSample = 16;
private short blockAlign = (short)(channels * bitsPerSample / 8);
private int avgBytesPerSec = blockAlign * sampleRate;
private char dataHdrID[] = { 'd', 'a', 't', 'a' };
private int dataHdrLeth;
public WaveHeader (int fileLength){
this.fileLength = fileLength + (44 - 8);
dataHdrLeth = fileLength;
}
public WaveHeader (int fileLength, short channels, short sampleRate, short bitsPerSample){
this.fileLength = fileLength + (44 - 8);
dataHdrLeth = fileLength;
this.channels = channels;
this.sampleRate = sampleRate;
this.bitsPerSample = bitsPerSample;
blockAlign = (short)(channels * bitsPerSample / 8);
avgBytesPerSec = blockAlign * sampleRate;
}
/**
* @return byte[] 44个字节
* @throws IOException
*/
public byte[] getHeader() throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
WriteChar(bos, fileID);
WriteInt(bos, fileLength);
WriteChar(bos, wavTag);
WriteChar(bos, fmtHdrID);
WriteInt(bos, fmtHdrLeth);
WriteShort(bos, formatTag);
WriteShort(bos, channels);
WriteInt(bos, sampleRate);
WriteInt(bos, avgBytesPerSec);
WriteShort(bos, blockAlign);
WriteShort(bos, bitsPerSample);
WriteChar(bos, dataHdrID);
WriteInt(bos, dataHdrLeth);
bos.flush();
byte[] r = bos.toByteArray();
bos.close();
return r;
}
private void WriteShort(ByteArrayOutputStream bos, int s)
throws IOException {
byte[] mybyte = new byte[2];
mybyte[1] = (byte) ((s << 16) >> 24);
mybyte[0] = (byte) ((s << 24) >> 24);
bos.write(mybyte);
}
private void WriteInt(ByteArrayOutputStream bos, int n) throws IOException {
byte[] buf = new byte[4];
buf[3] = (byte) (n >> 24);
buf[2] = (byte) ((n << 8) >> 24);
buf[1] = (byte) ((n << 16) >> 24);
buf[0] = (byte) ((n << 24) >> 24);
bos.write(buf);
}
private void WriteChar(ByteArrayOutputStream bos, char[] id) {
for (int i = 0; i < id.length; i++) {
char c = id[i];
bos.write(c);
}
}
}
使用方法:
// fileLength 录音数据的长度
WaveHeader header = new WaveHeader(fileLength);
// 返回44个字节的数组
byte[] waveHeaderBytes = header.getHeader();