Bonjour.
Je cherche à capturer du son en DirectX9 (Visual C++6) et j'utilise un filtergraph de la forme suivante :
C'est assez simple et mon problème concerne la configuration du Samplegrabber donc voici le détail :
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
Passons sur la gestion gourmande du fichier (que je vais corriger immédiatement !) ; d'après vous d'où pourrait provenir l'erreur ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"); } ...
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))...
Partager