Другие языки программирования и технологии

Запись звука с помощью DirectShow C#

Кто знаает как осущестивить в c# запись звука спомощью DirectShow?если можно то с примерами....
Рассмотрим и прокомментируем кратко порядок действий при записи данных с аудиоустройства. Все операции с аудиоустройством начинаются с попытки его открыть. Процедура "открывания" аудиоустройства выполняется при помощи вызова waveInOpen. Для вызова необходимо указать номер устройства, которое, как предполагается, будет выполнять запись. Узнать количество установленных в системе устройств и выяснить их возможности можно при помощи функций waveInGetNumDevs и waveInGetDevCaps соответственно. Можно указать флаг WAVE_MAPPER. В этом случае система сама подберет устройство, которое способно записать звук в указанном формате. Кроме того, в функции waveInOpen задается способ извещения приложения устройством записи. Всего предусмотренно три механизма таких извещений: передача сообщений указанному окну, вызов процедуры косвенного вызова, установка события (event). Следующий код иллюстрирует процедуру "открывания" аудиоустройства и записи одного буфера:

HWAVEIN hWaveIn;
WAVEFORMATEX WaveFormat;

WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
WaveFormat.nChannels = 1;
WaveFormat.nSamplesPerSec = 16000L;
WaveFormat.nBlockAlign = 2;
WaveFormat.nAvgBytesPerSec = WaveFormat.nSamplesPerSec*WaveFormat.nBlockAlign;
WaveFormat.wBitsPerSample = 16;
WaveFormat.cbSize = 0;

MMRESULT mmRes =
waveInOpen(&hWaveIn, WAVE_MAPPER, &WaveFormat, (DWORD)hWnd, 0L, CALLBACK_WINDOW);

В данном случае будет открыто устройство для записи звука со следующими параметрами:
сжатие - линейная импульсно-кодовая модуляция (PCM);
число канало - 1 (Моно) ;
частота дискретизации - 16кГц;
разрядность отсчета - 16 бит (2 байта на отсчет) ;

Если по каким-либо причинам устройство не может быть открыто, будет возвращен код ошибки. Для получение информации об ощибке по ее коду можно воспользоваться функцией waveInGetErrorText.

Если устройство было открыто успешно, можно приступать к записи. Для этого сначала нужно подготовить буфер:

WAVEHDR WaveHdr;
ULONG BufferSize = WaveFormat.nBlockAlign*WaveFormat.nSamplesPerSec*10;
WaveHdr.lpData = malloc(BufferSize);
WaveHdr.dwBufferLength = BufferSize;

waveInPrepareHeader(hWaveIn, &WaveHdr, sizeof(WAVEHDR));

waveInAddBuffer(hWaveIn, &WaveHdr, sizeof(WAVEHDR));

В данном случае был подготовлен буфер, достаточный для записи 10с звука. Теперь можно начать запись:

waveInStart(hWaveIn);

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

MM_WIM_DATA:

waveInUnprepareHeader(hWaveIn, &WaveHdr, sizeof(WAVEHDR));
//WaveHdr.lpData - указывают на буфер, где хранять записанные данные.
//После вызова waveInUnprepareHeader ими можно распоряжаться
//по собственному усмотрению
free(WaveHdr.lpData);

По окончанию записи следует закрыть аудиоустройство:

waveInClose(hWaveIn);
Асанбек Ниязбеков
Асанбек Ниязбеков
485
Лучший ответ
Виталий Саяхутдинов охх спаибо щас попробую,а ася у тебя есть?просто еще пару вопросов бы задать)
Виталий Саяхутдинов using DirectShowLib;?
некоторые не определяются((можно поточнее куда котно куда код стаится: