Question

Je veux jouer à l'audio reçu de la caméra IP.Le format des données audio compressées est G726 ADPCM.

J'ai cherché quelques jours sur Internet, mais je ne l'ai pas encore fait.

J'ai essayé de nombreuses façons de la jouer.Essayé de décoder à PCM et de construire l'en-tête pour créer un fichier Wave, mais tout a été échoué (peut-être que j'avais eu une erreur tout en le faisant).

Mais aujourd'hui, j'ai trouvé le code d'enregistrement et de lecture de l'audio d'ondes à partir de PC.

Voici Code:

// 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;
}

J'ai eu les données PCM stockées dans ma mémoire tampon et que je souhaite modifier le code ci-dessus pour la lire, je l'ai donc modifiée comme code suivant:

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);

mais il a jeté le message "Échec du chèque d'exécution # 3 - La variable" Hwavein "est utilisée sans être initialisée" lorsque WaveOutUnprepareheader () est appelé.

Comment init Hwavein?

C'est la première fois que je travaille avec Wave Audio donc je suis assez stupide ^^.

Pouvez-vous me montrer la bonne façon de le faire?

Était-ce utile?

La solution

Pour installer Hwavein Ouvrir Le périphérique audio:

MMRESULT waveInOpen(
  LPHWAVEIN phwi, 
  UINT uDeviceID, 
  LPCWAVEFORMATEX pwfx, 
  DWORD dwCallback, 
  DWORD dwInstance, 
  DWORD fdwOpen 
);

exemple :

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;
 }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top