2011-01-04 3 views
1

Je suis actuellement en train de construire une application qui utilise le DS SDK, et j'ai besoin de comprendre comment obtenir l'amplitude constamment de la source audio pour dessiner un visualiseur ou un spectre de quelque sorte. J'ai essayé de voir comment l'échantillonneur est implémenté en audio, mais toutes les informations que j'ai trouvées étaient obsolètes et inutiles. Après quelques tentatives douzaine, voici ce que j'ai actuellement:Comment utiliser SampleGrabber pour créer un spectre/visualiseur audio?

 ISampleGrabber pGrabber = (ISampleGrabber)pSampleGrabber; 
     hr = pGraph.ConnectDirect(GetPin(pInfinitePinTeeFilterAudio, "Output3"), GetPin(pSampleGrabber, "Input"), null); 
     checkHR(hr, "1040"); 
     if (hr < 0) return false; 
     hr = pGraph.ConnectDirect(GetPin(pSampleGrabber, "Output"), GetPin(pNullRenderer, "In"), null); 
     checkHR(hr, "1041"); 
     if (hr < 0) return false; 

     AMMediaType media = new AMMediaType(); 
     media.formatType = FormatType.WaveEx; 
     pGrabber.GetConnectedMediaType(media); //gets and sets media type into media 

     pGrabber.SetBufferSamples(true); 
     int cbbuffer = 0; 
     hr = pGrabber.GetCurrentBuffer(ref cbbuffer, IntPtr.Zero); 

Comment puis-je lire ce qui est sur le tampon courant, et lu en continu ce qui est sur le tampon?

+0

avez-vous un graphique de travail autre que de comprendre comment obtenir des échantillons de l'échantillonneur d'échantillons? – BrokenGlass

+0

Oui, mon graphique fonctionne complètement. Si l'information est nécessaire, j'ai un graphique qui prend une source à partir d'un réseau, et la joue localement. Il est comme suit: Source-> demux-> décodeurs audio/vidéo-> inf bro tees-> renderers. Le graphique fonctionne également avec la carte d'acquisition d'échantillons jointe. J'ai essayé de jouer avec samplegrabberCB, mais il semble y avoir seulement deux fonctions de pertinence: SampleCB et BufferCB, mais je ne trouve pas beaucoup de documentation dessus. –

Répondre

2

Vous êtes sur la bonne voie, vous devez implémenter une fonction de rappel que la carte d'acquisition d'échantillon peut utiliser, c'est ce que SampleCB est pour, le C# équivalent serait quelque chose comme ceci:

int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample pSample) 
{ 
    //work with audio sample here 
    return 0; 
} 

Assurez-vous aussi que vous ayez un décodeur audio avant votre échantillonneur dans votre graphe, sinon vous recevrez des échantillons compressés.

Il y a aussi un article pertinent here qui pourrait vous aider.

Questions connexes