PCM转WAV

//.H**********************************************************
class QPcmToWav : public QObject
{
    Q_OBJECT
public:
    QPcmToWav(QObject *parent = 0);

    void setFormat(const QAudioFormat &format);
    bool pcmToWav(const QByteArray &pcmData,QByteArray &wavData);

protected:
    QAudioFormat m_format;
};



//.CPP******************************************************
typedef struct
{
    char fccID[4];                //"RIFF"
    unsigned long dwSize;         //length-8
    char fccType[4];              //"WAVE"
}FCC_HEADER;

typedef struct
{
    char fccID[4];                    //"fmt "
    unsigned long dwSize;             //16
    unsigned short wFormatTag;        //1
    unsigned short wChannels;         //1 or 2
    unsigned long dwSamplesPerSec;    //44100
    unsigned long dwAvgBytesPerSec;   //
    unsigned short wBlockAlign;       //声道数*量化数/8
    unsigned short uiBitsPerSample;   //量化数 8 or 16
}FMT;

typedef struct
{
    char fccID[4];                     //"data"
    unsigned long dwSize;              //length-44
}DATA_HEADER;

typedef struct
{
    FCC_HEADER fccHeader;
    FMT fmt;
    DATA_HEADER dataHeader;
}WAV_HEADER;


QPcmToWav::QPcmToWav(QObject *parent) :
    QObject(parent)
{
}

void QPcmToWav::setFormat(const QAudioFormat &format)
{
    m_format = format;
}

bool QPcmToWav::pcmToWav(const QByteArray &pcmData,QByteArray &wavData)
{
    WAV_HEADER header;
    qstrcpy(header.fccHeader.fccID,"RIFF");
    header.fccHeader.dwSize = 44 + pcmData.size() - 8;
    qstrcpy(header.fccHeader.fccType,"WAVE");


    qstrcpy(header.fmt.fccID,"fmt ");
    header.fmt.dwSize = 16;
    header.fmt.wFormatTag = 1;
    header.fmt.wChannels = m_format.channelCount();
    header.fmt.dwSamplesPerSec = m_format.sampleRate();
    header.fmt.dwAvgBytesPerSec = m_format.sampleRate() * (m_format.sampleSize() / 8);
    header.fmt.wBlockAlign = m_format.sampleSize() / 8;
    header.fmt.uiBitsPerSample = m_format.sampleSize();

    qstrcpy(header.dataHeader.fccID,"data");
    header.dataHeader.dwSize = pcmData.size();

    char * pHeader = (char*)&header;
    int size = sizeof(header);
    wavData.append(pHeader,size);
    wavData.append(pcmData);

    return true;
}

猜你喜欢

转载自blog.csdn.net/wolfseek/article/details/44114745