如何将Pcm格式的音频文件转换成Wave格式的文件

最近在做一款变声App,其中就用到了将pcm格式转wave格式,下面贴出源代码,希望带有需求的童鞋有帮助!!!这里是c++语言写的,也可以用java实现。当然java调用native函数要用到jni技术。具体jni技术自己到网路上找找资料。

Cpp文件Pcm2Wave.cpp

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "wave.h"
#include "constant.h"

class Pcm2Wave
{
private:
    WAVE_HEAD wave_head;
    FILE* src_pcm_file;
    FILE* dest_wave_file;
public:
    Pcm2Wave()
    {
        memcpy(&wave_head.riff_char, "RIFF", 4);
        memcpy(&wave_head.wave, "WAVE", 4);
        memcpy(&wave_head.fmt, "fmt ", 4);
        memcpy(&wave_head.fccID, "fact", 4);
        memcpy(&wave_head.data_field, "data", 4);
        wave_head.package_len = 0;
        wave_head.format_len = 16;
        wave_head.fixed =  1;
        wave_head.channel_number = 1;
        //  采样率 long int samplespersec
        wave_head.sample_rate = 8000 ;

        // 量化数 int bitpersamples=8或16
        wave_head.bits_per_sample = 16;
        //  采样一次占字节数 int blockalig
        wave_head.byte_per_sample = wave_head.channel_number *  wave_head.bits_per_sample / 8; //NumChannels * BitsPerSample/8
           //  每秒播放字节数 long int bytepersec
        wave_head.byte_rate =     wave_head.sample_rate * wave_head.channel_number * wave_head.bits_per_sample / 8; //SampleRate * NumChannels * BitsPerSample /8

        wave_head.id = 4;
        wave_head.dwSize = 0;

        wave_head.data_len = 0;
    }

    Pcm2Wave(WAVE_HEAD* pwave_head)
    {
        if(pwave_head != NULL)
        {
            memcpy(&wave_head, pwave_head, sizeof(*pwave_head));
        }
    }

    ~Pcm2Wave()
    {}

    void set_channel(short pchannel_number)
    {
        wave_head.channel_number = pchannel_number;
        wave_head.byte_per_sample = wave_head.channel_number *  wave_head.bits_per_sample / 8;
        wave_head.byte_rate =     wave_head.sample_rate * wave_head.channel_number * wave_head.bits_per_sample / 8;
    }

    void set_sample_rate(int  psample_rate)
    {
        wave_head.sample_rate = psample_rate;
        wave_head.byte_rate =     wave_head.sample_rate * wave_head.channel_number * wave_head.bits_per_sample / 8;
    }

    void set_bits_per_sample(short pbits_per_sample)
    {
        wave_head.bits_per_sample =   pbits_per_sample;
        wave_head.byte_per_sample = wave_head.channel_number *  wave_head.bits_per_sample / 8;
        wave_head.byte_rate =     wave_head.sample_rate * wave_head.channel_number * wave_head.bits_per_sample / 8;
    }

    int change(const char *srcfile, const char *dsetfile)
    {
        int nFileLen = 0;
        int nSize = sizeof(wave_head);
        printf("wave的头的大小: %d\n", nSize);
        src_pcm_file = NULL;
        dest_wave_file = NULL;
        src_pcm_file = fopen(srcfile, "rb");
        if (src_pcm_file == NULL)
            return -1;

        dest_wave_file = fopen(dsetfile, "wb+");
        if (dest_wave_file == NULL)
            return -2;

        int nWrite = fwrite(&wave_head, 1, nSize, dest_wave_file);
        if (nWrite != nSize)
        {
            fclose(src_pcm_file);
            fclose(dest_wave_file);
            return -3;
        }

        while( !feof(src_pcm_file))
        {
            char readBuf[4096];
            int nRead = fread(readBuf, 1, 4096, src_pcm_file);
            if (nRead > 0)
            {
                fwrite(readBuf, 1, nRead, dest_wave_file);
            }

            nFileLen += nRead;
        }
        printf("文件指针位置: %d\n", ftell(dest_wave_file));
        //将目的文件的游标指针指向文件的开头
        printf("nFileLen的大小: %d\n nSize的大小:%d\n", nFileLen, nSize);
        fseek(dest_wave_file, 0, SEEK_SET);

        wave_head.package_len = nFileLen - 8 + nSize;
        wave_head.data_len = nFileLen;
        nWrite = fwrite(&wave_head, 1, nSize, dest_wave_file);
        if (nWrite != nSize)
        {
            fclose(src_pcm_file);
            fclose(dest_wave_file);
            return -4;
        }
        fclose(src_pcm_file);
        fclose(dest_wave_file);

        return 0;
    }

};

int main(char args [])
{
    Pcm2Wave pp;
    pp.set_sample_rate(11025);
    pp.change("jj.pcm", "jj.wav");
    return 0 ;
}

wave.h头文件

typedef struct WAVE_HEAD
{
    char riff_char[4];   // "RIFF" char riff_id[4]="RIFF"
    int package_len ;    //文件总长-8 long int size0=文总长-8
    char wave[4];
    char fmt[4];
    int format_len;
    short fixed;      //  fmttag=0x01
    short channel_number;  //  channel=1 或2
    int   sample_rate;   //  采样率 long int samplespersec
    int   byte_rate;   //  每秒播放字节数 long int bytepersec
    short byte_per_sample;   //  采样一次占字节数 int blockalign=声道数*量化数/8
    short bits_per_sample;   // 量化数 int bitpersamples=8或16
    char fccID[4]; // must be "fact"
    int  id; // must be 0x4
    int dwSize; // 暂时没发现有啥用
    char  data_field[4];   //  data_id="data"
    int  data_len;  //  采样数据字节数 long int size2=文长-44

} WAVE_HEAD;
时间: 2024-10-06 14:02:21

如何将Pcm格式的音频文件转换成Wave格式的文件的相关文章

Python:将utf-8格式的文件转换成gbk格式的文件

需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.open(filePath,"r",encoding) as f: return f.read() def WriteFile(filePath,u,encoding="gbk"): with codecs.open(filePath,"w",encodi

linux环境下deb格式文件转换成rpm格式

以 alien_8.87.tar.gz 为例: 下载.安装 alien_8.87.tar.gz [[email protected] ~]# wget http://ftp.de.debian.org/debian/pool/main/a/alien/alien_8.87.tar.gz [[email protected] ~]# tar zxvf alien_8.87.tar.gz [[email protected] ~]# cd alien [[email protected] alien

C# Tips: 将 VS2012 / VS2013 的.sln文件、project文件转换成 VS2010格式

原来有一些VS2013的工程文件(.sln..csproj),使用.Net 4.0.现需要将它们转换成VS2010格式. 经实验,办法如下: (1) 在Solution文件(.sln)中: 把文件头部这样的行: Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2013 把它们替换成: Microsoft Visual Studio Solution File, Format Version 1

如何将pdf文件转换成cad格式文件

pdf文件是一个封闭性文件,文件不仅不容易编辑修改,而且还可能被加密了,那么如何将pdf文件转换成cad格式文件呢? 下面小编教大家使用pdf转换器实现以上操作,具体步骤如下. 第一步:搜索迅捷pdf在线转换器(http://app.xunjiepdf.com/pdf2cad),找到相关页面点击进入在线网站主页面,进入页面后,用我们鼠标点到文档转换,找到CAJ转Word那个栏目. 第二步:点击"选择文件"选择需要处理的文件.如果想要一次性处理多个文件,那么我们可以继续添加文件(批量转换

python:将xml格式文件转换成json格式文件

由于json格式的文件在处理起来,有很强的便利性,而工作中每天产生大量的xml格式的文件,所以有需求将xml格式的文件转换成json格式的文件.下面直接贴出代码,有两个版本,根据需求自由选择: #!/usr/bin/python # -*- coding: utf-8 -*- #Function:Xml_To_Json #version 1.0 #Author: Herman #需要用到的两个模块 import xmltodict; import json; #定义函数 def pythonXm

如何使用PDF转换器将PDF文件转换成Excel格式

其实作为办公中,对于PDF和Excel两种格式大家还是比较喜欢使用Excel格式,因为它操作起来比较简单.方便.PDF格式虽然很受欢迎,但是这种格式的虽然安全性比较高但没办法进行编辑,在处理的时候有很多不便的地方.在很多时候需要将PDF转换为Excel的格式,那该怎么转换呢? 1.转换文件格式之前首先我们可以打开浏览器搜索PDF转换器,进入到软件的官网中进行安装,利用工具来进行操作. 2.打开PDF转换器后,进入主页面.选择打开第一类栏目PDF转换其它文件,点击文件转Excel. 3.点击添加文

Excel文件转换成PDF格式如何操作

Excel文件相信对于办公一族的人来说是在熟悉不过了.每天多多少少都要处理到它,像数据之类的文件一般都保存在Excel文件中.当然有时候考虑到一些因素需要将Excel文件转换成PDF格式,这样的文件格式转换我们该怎么操作呢?不知道的伙伴不妨试下下面这种方法 ,希望能帮助到大家! 1:想要完整的进行格式间的转换,我们可以选择在电脑端进行操作,将Excel转换PDF格式的话可以利用到辅助型的工具.进入到浏览器搜索相关软件就可以进行安装.2:进入PDF转换器的主页面.可以清晰明了的看到它许多PDF功能

CAD文件转换成DWF格式文件怎么在转换器中转换?

CAD文件转换成DWF格式文件怎么在转换器中转换?大家都知道DWF文件是一种高度压缩.开放.安全的文件格式,它可以将丰富的设计数据高效的分发给需要查看.评审或者打印这些数据的人看,因为在编辑器中编辑完的图纸都是dwg格式的,所以就需要将CAD图纸进行转换,那CAD文件转换成DWF格式文件怎么在转换器中转换?具体要怎么来进行操作?下面小编就来教教大家,想要了解的朋友也可以一起来看看,希望能够帮助到你们. 第一步:打开电脑,在电脑桌面上任意的打开一个浏览器,在浏览器的搜索框中搜索迅捷CAD转换器,然

怎么将PDF格式文件转换成CAD格式呢?

怎么将PDF格式文件转换成CAD格式呢?在日常生活中,PDF和CAD格式的文件我们都不少见,那我们应该使用什么办法将这两个格式的文件进行转换呢?今天小编就要来教大家的就是怎么将PDF格式的文件转换成CAD格式的全部操作了,希望被采纳! 第一步:首先要打开你们电脑上面的CAD转换器软件,如果你们电脑上面没有这样一款软件的话,你们就需要去到官网上面的进行搜索下载了!小编是用的就是这款"迅捷CAD转换器"软件!第二步:将软件完成下载之后安装到你们的电脑桌面上然后就可以进行操作使用了!之后点击