資源簡介
200行代碼實現(xiàn)PCM格式的WAV文件的讀寫,使用標準C++庫實現(xiàn),不依賴于其他庫。
// Write WAv文件
Wave_header header(1, 48000, 16);
uint32_t length = header.fmt_data->sample_per_sec * 10 * header.fmt_data->bits_per_sample / 8;
uint8_t *data = new uint8_t[length];
CWaveFile::write("e:\\test1.wav", header, data, length);
// read
//CWaveFile wave;
//wave.read("e:\\test1.wav");
代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
using?namespace?std;
#define?FOURCC?uint32_t
#define?MAKE_FOURCC(abcd)?\
(?((uint32_t)d)?|?(?((uint32_t)c)?<8?)?|?(?((uint32_t)b)?<16?)?|?(?((uint32_t)a)?<24?)?)
template??struct?MakeFOURCC{?enum?{?value?=?(ch0?<0)?+?(ch1?<8)?+?(ch2?<16)?+?(ch3?<24)?};?};
//?Format?chunk?data?field
struct?Wave_format{
uint16_t?format_tag;??????//?WAVE的數(shù)據(jù)格式,PCM數(shù)據(jù)該值為1
uint16_t?channels;????????//?聲道數(shù)
uint32_t?sample_per_sec;??//?采樣率
uint32_t?bytes_per_sec;???//?碼率,channels?*?sample_per_sec?*?bits_per_sample?/?8
uint16_t?block_align;?????//?音頻數(shù)據(jù)塊,每次采樣處理的數(shù)據(jù)大小,channels?*?bits_per_sample?/?8
uint16_t?bits_per_sample;?//?量化位數(shù),8、16、32等
uint16_t?ex_size;?????????//?擴展塊的大小,附加塊的大小
Wave_format()
{
format_tag??????=?1;?//?PCM?format?data
ex_size?????????=?0;?//?don‘t?use?extesion?field
channels????????=?0;
sample_per_sec??=?0;
bytes_per_sec???=?0;
block_align?????=?0;
bits_per_sample?=?0;
}
Wave_format(uint16_t?nb_channel?uint32_t?sample_rate?uint16_t?sample_bits)
:channels(nb_channel)?sample_per_sec(sample_rate)?bits_per_sample(sample_bits)
{
format_tag????=?0x01;???????????????????????????????????????????//?PCM?format?data
bytes_per_sec?=?channels?*?sample_per_sec?*?bits_per_sample?/?8;?//?碼率
block_align???=?channels?*?bits_per_sample?/?8;
ex_size???????=?0;???????????????????????????????????????????????//?don‘t?use?extension?field
}
};
//?The?basic?chunk?of?RIFF?file?format
struct?base_chunk{
FOURCC?fcc;????//?FourCC?id
uint32_t?cb_size;?//?數(shù)據(jù)域的大小
base_chunk(FOURCC?fourcc)
:?fcc(fourcc)
{
cb_size?=?0;
}
};
/*
數(shù)據(jù)格式為PCM的WAV文件的基本結(jié)構(gòu)
--------------------------------
|?base_chunk?|?RIFF |
---------------------
| WAVE????????????|
---------------------
|?base_chunk?|?fmt??| Header
---------------------
|?Wave_format|??????|?
---------------------
|?base_chunk?|?data?|
---------------------------------
|????PCM?data???????????????????|
---------------------------------
*/
/*
數(shù)據(jù)格式為PCM的WAV文件頭
--------------------------------
|?base_chunk?|?RIFF |
---------------------
| WAVE????????????|
---------------------
|?base_chunk?|?fmt??| Header
---------------------
|?Wave_format|??????|
---------------------
|?base_chunk?|?data?|
--------------------------------
*/
struct?Wave_header{
shared_ptrse_chunk>?riff;
FOURCC?wave_fcc;
shared_ptrse_chunk>?fmt;
shared_ptr??fmt_data;
shared_ptrse_chunk>?data;
Wave_header(uint16_t?nb_channel?uint32_t?sample_rate?uint16_t?sample_bits)
{
riff??????=?make_sharedse_chunk>(MakeFOURCC<‘R‘?‘I‘?‘F‘?‘F‘>::value);
fmt???????=?make_sharedse_chunk>(MakeFOURCC<‘f‘?‘m‘?‘t‘?‘?‘>::value);
fmt->cb_size?=?18;
fmt_data??=?make_shared(nb_channel?sample
評論
共有 條評論