Как использовать SampleGrabber для создания спектра / визуализатора для аудио? - PullRequest
1 голос
/ 04 января 2011

В настоящее время я создаю приложение, которое использует DS SDK, и мне нужно выяснить, как постоянно получать амплитуду от аудиоисточника, чтобы нарисовать визуализатор или какой-либо спектр. Я пытался посмотреть, как сэмпл-граббер реализован на аудио, но вся информация, которую я нашел, устарела и бесполезна. После нескольких десятков попыток вот что у меня сейчас:

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

Как мне прочитать, что находится в текущем буфере, и постоянно читать, что находится в буфере?

1 Ответ

2 голосов
/ 04 января 2011

Вы на правильном пути, вам нужно реализовать функцию обратного вызова, которую может использовать образец граббера, вот для чего SampleCB , эквивалент C # будет примерно таким:

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

Также убедитесь, что у вас есть аудиодекодер до вашего захвата семплов на вашем графике, иначе вы получите сжатые семплы.

Здесь также есть соответствующая статья , которая может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...