使用C的多通道WAV文件处理

时间:2019-01-13 12:12:30

标签: c audio wav

我想制作一个可以播放wav文件的工具。 幸运的是,我找到了一个很好的例子,可以很好地播放单声道或立体声wav文件。 但是我真正需要的是一个可以播放多通道wav文件的工具。

我发现多通道wav文件的格式标签为65534(表示可扩展波形格式),并且该格式具有更多的标头信息,因此我只是在我的代码中添加了waveformatexx:

waveFormatExt.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
waveFormatExt.Format.nAvgBytesPerSec = riffFormat.nAvgBytesPerSec;
waveFormatExt.Format.nBlockAlign = riffFormat.nBlockAlign;
waveFormatExt.Format.nChannels = riffFormat.nChannels;
waveFormatExt.Format.nSamplesPerSec = riffFormat.nSamplesPerSec;
waveFormatExt.Format.wFormatTag = riffFormat.wFormatTag;
waveFormatExt.Format.wBitsPerSample = riffFormat.wBitsPerSample;
waveFormatExt.dwChannelMask = extFormat.dwChannelMask;
waveFormatExt.SubFormat = extFormat.SubFormat;
waveFormatExt.Samples.wSamplesPerBlock = extFormat.wSamplesPerBlock;
waveFormatExt.Samples.wValidBitsPerSample = extFormat.wValidBitsPerSample;

waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveFormatExt, (DWORD)WaveOutProc, (DWORD)lpWaveData, CALLBACK_FUNCTION);
{
    dwDelay = (riffFormat.wBitsPerSample / 8) * riffFormat.nSamplesPerSec * riffFormat.nChannels;
    _tprintf(TEXT("bytesPerSec = %d\n"), dwDelay);
    dwDelay = riffData.dwChunkSize / dwDelay;
    _tprintf(TEXT("TotalSec = %d (%02d:%02d)\n"), dwDelay, (dwDelay / 60), (dwDelay % 60));

    waveHeader.lpData = (LPVOID)lpWaveData;
    waveHeader.dwBufferLength = riffData.dwChunkSize; 
    waveHeader.dwBytesRecorded = 0;
    waveHeader.dwFlags = 0L;
    waveHeader.dwLoops = 0L;
    waveHeader.dwUser = 0;
    waveHeader.lpNext = NULL;
    waveHeader.reserved = 0L;

    waveOutPrepareHeader(hWaveOut, &waveHeader, sizeof(WAVEHDR));
    {
        waveOutWrite(hWaveOut, &waveHeader, sizeof(WAVEHDR));
        Sleep(dwDelay * 1000 + 1000);
    }

    waveOutUnprepareHeader(hWaveOut, &waveHeader, sizeof(WAVEHDR));

当formattag为1时,我使用称为Waveformatex的结构,并使用类似于上述代码的播放结构,并且上面的代码是当文件是多通道wav文件时用于播放的代码。

无论使用哪种方法,我都想播放一个多通道的wav文件。 任何人都可以帮助解决这个问题。

谢谢。

0 个答案:

没有答案