我已经安装了Speex语音ACM编解码器1.0.1.1编解码器,它们似乎具有DIFFERENT .wav标头,然后在此NSpeex(C#)软件包的C#代码中描述了一个标头。

我可以读取使用“ Speex Voice ACM编解码器1.0.1.1”创建的.wav文件,并成功对其进行解码,但是当我创建.wav文件时,“ Speex Voice ACM编解码器1.0.1.1”无法识别我的标头。我使用Hex编辑器进行了检查,.wav标头中有一些字节由“ Speex Voice ACM Codec 1.0.1.1”创建,但是我没有创建,它们与NSpeex.PcmWaveWriter类中的字节不同。

所以,我同意这一部分:

raf.Write(WAVE_FORMAT_SPEEX); // Format tag: Speex
raf.Write((short)channels); // Number of channels
raf.Write(sampleRate); // Sampling frequency
raf.Write((CalculateEffectiveBitrate(mode, channels, quality) + 7) >> 3); // Average bytes per second
raf.Write((short)CalculateBlockSize(mode, channels, quality)); // Blocksize of data
raf.Write((short)quality); // Bits per sample


但是,其余的内容与NSpeex.PcmWaveWriter类的代码无关。

在十六进制编辑器中,我在上面提到的部分之后看到了由“ Speex Voice ACM Codec 1.0.1.1”创建的.wav文件中的内容:

//byte[] speexSpecific ={
//   0x00, 0x01, 0x02, 0x00,0x0a, 0x00,
//   0x00, 0x00, 0xf4, 0x01,
//   0x03, 0x00, 0x00, 0x00};


但是我不知道这是什么,以及如何创建与“ Speex Voice ACM Codec 1.0.1.1”兼容的.wav标头。
同样,我可以解码它们的.wav文件,并创建可以解码的.wav文件,但是该编解码器似乎无法识别我的.wav标头。

Speex应该是“开源的”,有人可以透露.wav(speex)标头中的秘密字节吗?

最佳答案

我找到了!这正好解释了我丢失的14个字节(检查SPEEX_WFX_EXTRA_BYTES = 14)

//typedef struct tWAVEFORMATEX
//{
//    WORD        wFormatTag;         /* format type */
//    WORD        nChannels;          /* number of channels (i.e. mono, stereo...) */
//    DWORD       nSamplesPerSec;     /* sample rate */
//    DWORD       nAvgBytesPerSec;    /* for buffer estimation */
//    WORD        nBlockAlign;        /* block size of data */
//    WORD        wBitsPerSample;     /* number of bits per sample of mono data */
//    WORD        cbSize;             /* the count in bytes of the size of */
//                                    /* extra information (after cbSize) */
//} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;

//#define WAVE_FORMAT_SPEEX                           0xa109
//#define SPEEXWAVEFORMAT_VERSION 0x0100    // 1.0
//#define SPEEX_WFX_EXTRA_BYTES   14

///*
//    wfx.wFormatTag = WAVE_FORMAT_SPEEX
//    wfx.nChannels = 1,2
//    wfx.nSamplesPerSec = 8000,16000,32000
//    wfx.nAvgBytesPerSec = ...
//    wfx.nBlockAlign = CBR? ... : 1
//    wfx.wBitsPerSample = 16
//    wfx.cbSize = SPEEX_WFX_EXTRA_BYTES

//    For VBR:
//    wfx.nAvgBytesPerSec = SPEEX_BITRATE_24600;
//*/

//typedef struct speexwaveformat_tag
//{
//    WAVEFORMATEX    wfx;

//    WORD nVersion;        // SPEEXWAVEFORMAT_VERSION
//    WORD nFramesPerBlock;// 1..
//    WORD nQuality;        // 0..10
//    WORD nMode;           // SPEEX_MODE_...
//    WORD nVbrQuality; // 0..1000 ,float [0.00 , 10.00]
//    WORD nComplexity; // 1..10
//    WORD nFlags;      // SPEEX_FLAG_...
//} SPEEXWAVEFORMAT;
// CBR,ABR,VBR

//#define SPEEX_MODE_CBR            0
//#define SPEEX_MODE_ABR            1
//#define SPEEX_MODE_VBR            2

//// flags
//#define SPEEX_FLAG_VAD            0x0001
//#define SPEEX_FLAG_DTX            0x0002

//#define SPEEX_DEF_QUALITY 3
//#define SPEEX_DEF_COMPLEXITY 3
//#define SPEEX_DEF_VBR_QUALITY 500

10-07 20:18