首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何播放G726 ADPCM buffer?

如何播放G726 ADPCM buffer?
EN

Stack Overflow用户
提问于 2012-02-29 20:23:06
回答 1查看 1.2K关注 0票数 1

我想播放从IP摄像机接收到的音频。压缩后的音频数据格式为G726 ADPCM。

我已经在网上找了几天了,但还没查到。

我已经尝试了很多很多方法来回放它。尝试解码到PCM并构建头文件来创建Wave文件,但都失败了(可能我在做的时候有一些错误)。

但是今天,我找到了在PC上录制和播放wave音频的代码。

下面是代码:

代码语言:javascript
复制
// ADPCM.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <MMSystem.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    const int NUMPTS = 8000*10;//44100 * 10;
    int sampleRate = 8000;//44100;
    short int waveIn[NUMPTS];

    HWAVEIN hWaveIn;
    WAVEHDR WaveInHdr;
    MMRESULT result;
    HWAVEOUT hWaveOut;

    WAVEFORMATEX pFormat;
    pFormat.wFormatTag = WAVE_FORMAT_PCM;
    pFormat.nChannels = 1;
    pFormat.nSamplesPerSec = sampleRate;
    pFormat.nAvgBytesPerSec = 2 * sampleRate;
    pFormat.nBlockAlign = 2;
    pFormat.wBitsPerSample = 16;
    pFormat.cbSize = 0;

    result = waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat, 0, 0, WAVE_FORMAT_DIRECT);

    if(result)
    {
        char fault[256];
        waveInGetErrorTextA(result, fault, 256);
        MessageBoxA(NULL, fault, "Failed to open waveform input device.", MB_OK | MB_ICONEXCLAMATION);
        return 1;
    }

    WaveInHdr.lpData = (LPSTR)waveIn;
    WaveInHdr.dwBufferLength = 2 * NUMPTS;
    WaveInHdr.dwBytesRecorded = 0;
    WaveInHdr.dwUser = 0;
    WaveInHdr.dwFlags = 0;
    WaveInHdr.dwLoops = 0;
    waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));

    result = waveInAddBuffer(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
    if(result)
    {
        MessageBoxA(NULL, "Failed to read block from device", NULL, MB_OK | MB_ICONEXCLAMATION);
        return 1;
    }

    result = waveInStart(hWaveIn);
    if(result)
    {
        MessageBoxA(NULL, "Failed to start recording", NULL, MB_OK | MB_ICONEXCLAMATION);
        return 1;
    }

    cout << "Recording..." << endl;
    Sleep((NUMPTS/sampleRate) * 1000); //Sleep while recording

    cout << "Playing..." << endl;

    if(waveOutOpen(&hWaveOut, WAVE_MAPPER, &pFormat, 0, 0, WAVE_FORMAT_DIRECT))
    {
        MessageBoxA(NULL, "Failed to replay", NULL, MB_OK | MB_ICONEXCLAMATION );
    }

    waveOutWrite(hWaveOut, &WaveInHdr, sizeof(WaveInHdr));
    Sleep((NUMPTS/sampleRate) * 1000); //Sleep for as long as there was recorded

    waveOutUnprepareHeader(hWaveOut, &WaveInHdr, sizeof(WAVEHDR));
    waveInUnprepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
    waveInClose(hWaveIn);
    waveOutClose(hWaveOut);

    return 0;
}

我将PCM数据存储在我的缓冲区中,我想修改上面的代码来播放它,所以我将其编辑为以下代码:

代码语言:javascript
复制
const int NUMPTS = 4000;//44100 * 10;
    int sampleRate = 8000;//44100;
    CHAR waveIn[NUMPTS];

    HWAVEIN hWaveIn;
    WAVEHDR WaveInHdr;
    MMRESULT result;
    HWAVEOUT hWaveOut;

    WAVEFORMATEX pFormat;
    pFormat.wFormatTag = WAVE_FORMAT_PCM;
    pFormat.nChannels = 1;
    pFormat.nSamplesPerSec = sampleRate;
    pFormat.nAvgBytesPerSec = sampleRate/2;//2 * sampleRate;
    pFormat.nBlockAlign = 1;//2;
    pFormat.wBitsPerSample = 4;//16;
    pFormat.cbSize = 0;


    WaveInHdr.lpData = (LPSTR)waveIn;
    WaveInHdr.dwBufferLength = 2 * NUMPTS;
    WaveInHdr.dwBytesRecorded = 0;
    WaveInHdr.dwUser = 0;
    WaveInHdr.dwFlags = 0;
    WaveInHdr.dwLoops = 0;
    waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));

    memcpy(WaveInHdr.lpData, myPCMBuffer, NUMPTS);

    waveOutWrite(hWaveOut, &WaveInHdr, sizeof(WaveInHdr));

    waveOutUnprepareHeader(hWaveOut, &WaveInHdr, sizeof(WAVEHDR));
    waveInUnprepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
    waveInClose(hWaveIn);
    waveOutClose(hWaveOut);

但是当调用waveOutUnprepareHeader()时,它抛出消息“运行时检查失败#3 -变量'hWaveIn‘正在使用而没有被初始化”。

如何初始化hWaveIn?

这是我第一次使用wave音频,所以我很愚蠢^^。

你能告诉我做这件事的正确方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-29 20:30:13

初始化音频设备的hWaveIn open

代码语言:javascript
复制
MMRESULT waveInOpen(
  LPHWAVEIN phwi, 
  UINT uDeviceID, 
  LPCWAVEFORMATEX pwfx, 
  DWORD dwCallback, 
  DWORD dwInstance, 
  DWORD fdwOpen 
);

Example

代码语言:javascript
复制
result = waveInOpen(&hWaveIn, WAVE_MAPPER,&pFormat,
            0L, 0L, WAVE_FORMAT_DIRECT);
 if (result)
 {
  char fault[256];
  waveInGetErrorText(result, fault, 256);
  Application->MessageBox(fault, "Failed to open waveform input device.",
              MB_OK | MB_ICONEXCLAMATION);
  return;
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9499114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档