C++ 实现pcm 转wav

输入音PCM 属性: 16k采样率 16位深  单声道

#include <iostream>

#include <vector>

#include <fstream>

using namespace std;

/* wav音频头部格式 */

typedef struct _wave_pcm_hdr

{

    char            riff[4];                // = "RIFF"

    int             size_8;                 // = FileSize - 8

    char            wave[4];                // = "WAVE"

    char            fmt[4];                 // = "fmt "

    int             fmt_size;               // = 下一个结构体的大小 : 16

    short int       format_tag;             // = PCM : 1

    short int       channels;               // = 通道数 : 1

    int             samples_per_sec;        // = 采样率 : 8000 | 6000 | 11025 | 16000

    int             avg_bytes_per_sec;      // = 每秒字节数 : samples_per_sec * bits_per_sample / 8

    short int       block_align;            // = 每采样点字节数 : wBitsPerSample / 8

    short int       bits_per_sample;        // = 量化比特数: 8 | 16

    char            data[4];                // = "data";

    int             data_size;              // = 纯数据长度 : FileSize - 44

} wave_pcm_hdr;

/* 默认wav音频头部数据 */

wave_pcm_hdr default_wav_hdr =

{

    { 'R', 'I', 'F', 'F' },

    0,

    {'W', 'A', 'V', 'E'},

    {'f', 'm', 't', ' '},

    16,

    1,

    1,

    16000,

    32000,

    2,

    16,

    {'d', 'a', 't', 'a'},

    0  

};

int main()

{

     // 读取文件

    filebuf* pbuf;

    ifstream filestr;

    int size;

    // 要采用二进制方式打开

    filestr.open("in.pcm", ios::binary);

    if (!filestr.is_open())

    {

        cout << "in file open failed !"<<endl;

        return -1;

    }

    // 获取filestr对应buffer对象的指针

    pbuf = filestr.rdbuf();

    // 调用buffer对象方法获取文件大小

    size = pbuf->pubseekoff(0, ios::end, ios::in);

    pbuf->pubseekpos(ios::beg, ios::in);

    // 加载文件中数据到内存进行wav重组

    // 打开输出文件

    ofstream  fileOutWav;

    fileOutWav.open("out.wav", ios::binary | ios::out);

    if (!fileOutWav.is_open())

    {

        cout << "out file open failed !"<<endl;

        return -1;

    }

    //定义wav头,写入文件

    wave_pcm_hdr wav_hdr      = default_wav_hdr;

    wav_hdr.data_size = size; //pcm 大小

    wav_hdr.size_8 = wav_hdr.data_size + (sizeof(wav_hdr) - 8);

    fileOutWav.write((char *)&wav_hdr, sizeof(wav_hdr)) ;

   

    char mem_data[1] = {0};

    for (int i = 0; i <= size; i++)

    {

        //读取pcm 到内存

        pbuf->sgetn(mem_data, 1);

        //写入wav文件

        fileOutWav.write(mem_data,1);

    }

   

    filestr.close();

    fileOutWav.close();

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半岛铁盒.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值