资源简介
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
相关资源
- wav生成波形图
- mfc waveout播放器
- WAV文件的读写接口类,依赖标准C++库
- C++读取WAV格式音频文件
- C++实现音频录音wav格式
- C++封装mp3文件转wav文件的DLL
- 生成指定长度的Wav空白文件--
- mfcc,,可输入自己的wav文件运行
- C++短信猫短信收发封装
- linux下alsa架构采集声音成wav格式播放
- VC++wav文件的读写
- WavToC转换器
- 移动联通短信猫wavecom收发插件
- 51单片机播放WAV
- g711与wav互转的接口
- C++实战源码-WaveForm音频采集单缓存
- C++实战源码-Wave文件播放1
- C++实战源码-WaveForm音频采集双缓存
- C 播放WAVE音频
- C++实战源码-Wave文件播放2
- C++实战源码-Wave文件播放3
- C_C++ Wavelet小波分析之一维小波分解与
- c语言实现语音采集并写入WAV文件
- C语言生成正弦波函数的wave音频文件
- Windows API录音 WaveRecorder类 (c++)
- 按照一定的信噪比给wav添加噪声
评论
共有 条评论