problème de capture son avec Directshow
Bonjour.
Je cherche à capturer du son en DirectX9 (Visual C++6) et j'utilise un filtergraph de la forme suivante :
http://r.lourd.free.fr/divers/graph-...developpez.jpg
C'est assez simple et mon problème concerne la configuration du Samplegrabber donc voici le détail :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| // Configuration du filtre SampleGrabber2
WAVEFORMATEX fluxAudio;
fluxAudio.wFormatTag = WAVE_FORMAT_PCM;
fluxAudio.nChannels = 1;
fluxAudio.nSamplesPerSec = 8000;
fluxAudio.nAvgBytesPerSec = 16000;
fluxAudio.nBlockAlign = 2;
fluxAudio.wBitsPerSample = 16;
fluxAudio.cbSize = 0; // apparemment aucun effet
AM_MEDIA_TYPE mt2;
ZeroMemory(&mt2, sizeof(AM_MEDIA_TYPE));
mt2.majortype = MEDIATYPE_Audio;
mt2.subtype = MEDIASUBTYPE_PCM;
mt2.formattype = FORMAT_WaveFormatEx;
hr = pGrabber2->SetMediaType(&mt2);
if (FAILED(hr))
{
Msg(TEXT("Impossible de mettre à jour le type de média du sample grabber 2, hr=0x%x\r\n\r\n")
TEXT("Le programme va se terminer"), hr);
pGrabberF2->Release();
return hr;
} |
J'utilise donc une structure WAVEFORMATEX qui devrait me capturer le son en 8000Hz 16bits mono or le son que j'obtiens (stocké dans un fichier avec le code ci-après) est en 44100Hz 16bits stéréo, et la moitié seulement est capturée:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
long cbBufferAudio = 176400;
char *pBufferAudio = new char[cbBufferAudio];
while (!stopenvoi)
{
// On va chercher dans le buffer de capture la dernière trame son capturée.
pGrabber2->GetCurrentBuffer(&cbBufferAudio,reinterpret_cast<long*>(pBufferAudio));
// Ecriture d'une trame de son brut capturée pendant 1s dans "son_brut.raw"
// situé dans le même répertoire que applicap.exe
FILE *son_brut;
if ((son_brut=fopen("son_brut.raw","a"))!=NULL)
{
fwrite(pBufferAudio,176400,1,son_brut);
fclose(son_brut);
}
else
{
printf("Problem opening the file\n");
}
... |
Passons sur la gestion gourmande du fichier (que je vais corriger immédiatement !) ; d'après vous d'où pourrait provenir l'erreur ?
Merci d'avance car après cette capture il faut que je traite le son pour le diffuser en mu-Law par sockets (d'où le while (!stopenvoi))...