• 大小: 7KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-08
  • 语言: C/C++
  • 标签: wav  

资源简介

200行代码实现PCM格式的WAV文件的读写,使用标准C++库实现,不依赖于其他库。 // 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的数据格式,PCM数据该值为1
uint16_t channels;        // 声道数
uint32_t sample_per_sec;  // 采样率
uint32_t bytes_per_sec;   // 码率,channels * sample_per_sec * bits_per_sample / 8
uint16_t block_align;     // 音频数据块,每次采样处理的数据大小,channels * bits_per_sample / 8
uint16_t bits_per_sample; // 量化位数,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; // 数据域的大小

base_chunk(FOURCC fourcc)
: fcc(fourcc)
{
cb_size = 0;
}
};

/*

数据格式为PCM的WAV文件的基本结构
--------------------------------
| base_chunk | RIFF |
---------------------
| WAVE            |
---------------------
| base_chunk | fmt  | Header
---------------------
| Wave_format|      | 
---------------------
| base_chunk | data |
---------------------------------
|    PCM data                   |
---------------------------------
*/

/*

数据格式为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

评论

共有 条评论