Создание графа записи звука
[Функция, связанная с этой страницей, DirectShow — это устаревшая функция. Он был заменен MediaPlayer, МВФMediaEngine и аудио/видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, МВФMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Первым шагом для приложения записи звука является создание графа фильтров. Конфигурация графа зависит от типа файла, который требуется создать.
- Файл AVI только для аудио: фильтр записи звука в фильтр AVI Mux и AVI Mux в фильтр записи файлов.
- WAV-файл: фильтр записи звука в образец фильтра wavDest в фильтр записи файлов
- Файл аудиозаписи Windows Media (.wma): фильтр аудиозаписи в фильтр записи WM ASF.
Фильтр WavDest предоставляется в качестве примера пакета SDK. Чтобы использовать его, необходимо создать и зарегистрировать фильтр.
Чтобы использовать фильтр записи ASF, необходимо установить пакет SDK для Windows Media и получить ключ программного обеспечения для разблокировки фильтра. Дополнительные сведения см. в разделе "Использование Windows Media" в DirectShow.
Вы можете создать граф фильтров с помощью объекта Capture Graph Builder или создать граф вручную. Это значит, что приложение автоматически добавляет и подключает каждый фильтр. В этой статье описывается подход вручную. Дополнительные сведения об использовании построителя графов захвата см. в разделе "Запись видео". Большая часть информации в этой статье относится к графам только для аудио.
Добавление устройства записи звука
Так как фильтр записи звука взаимодействует с определенным аппаратным устройством, невозможно просто вызвать CoCreateInstance для создания фильтра. Вместо этого используйте перечислитель системных устройств для перечисления всех устройств в категории "Источники записи звука", которая определяется идентификатором класса CLSID_AudioInputDeviceCategory.
Перечислитель системных устройств возвращает список моникеров для устройств; Понятное имя каждого моникера соответствует имени устройства. Выберите один из возвращенных моникеров и используйте его для создания экземпляра фильтра записи звука для этого устройства. Добавьте фильтр в граф фильтров. Предпочтительный звуковой устройство пользователя отображается в списке моникера. (Пользователь выбирает предпочтительное устройство, щелкнув звуки и мультимедиа в панель управления.)
Дополнительные сведения см. в разделе "Использование перечислителя системных устройств".
Чтобы указать входные данные для записи, получите интерфейс IAMAudioInputMixer из фильтра записи звука и вызовите метод put_Enable, чтобы указать входные данные. Однако одним из ограничений этого метода является то, что разные аппаратные устройства могут использовать разные строки для идентификации входных данных. Например, одна карточка может использовать "Микрофон" для идентификации входных данных микрофона, а другая карта может использовать "Микрофон". Чтобы определить идентификатор строки для заданных входных данных, используйте функции Windows Мультимедиа waveOutOpen, mixerOpen и mixerGetLineInfo. Дополнительные сведения см . в запросах устройств Mixer.
Добавление мультиплексера и записи файлов
Граф записи звука должен содержать мультиплексор и модуль записи файлов.
Мультиплексор — это фильтр, который объединяет один или несколько потоков в один поток с определенным форматом. Например, фильтр AVI Mux объединяет звуковые и видеопотоки в чередуемый поток AVI. Для записи звука обычно существует только один аудиопоток, но звуковые данные по-прежнему должны быть упаковлены в формат, который можно сохранить на диске, который требует мультиплексера. Выбор мультиплексера зависит от целевого формата:
- AVI: мультиплексер AVI
- WAV: WavDest
- WMA: модуль записи ASF
Модуль записи файлов — это фильтр, который записывает входящие данные в файл. Для файлов AVI или WAV используйте фильтр записи файлов. Для WMA-файлов средство записи ASF действует как мультиплексер, так и средство записи файлов.
После создания фильтров и добавления их в граф подключите выходной пин-код фильтра аудиозахвата к входному пин-коду мультиплексера и подключите выходной пин-код мультиплексера к входному закреплению средства записи фильтров (при условии, что они являются отдельными фильтрами). Чтобы указать имя файла, запросите модуль записи файлов для интерфейса IFileSinkFilter и вызовите метод IFileSinkFilter::SetFileName.
Пример кода
В следующем примере показано, как создать граф записи звука с помощью фильтра WavDest. Те же принципы применяются к другим типам файлов.
IBaseFilter *pSrc = NULL, *pWaveDest = NULL, *pWriter = NULL;
IFileSinkFilter *pSink= NULL;
IGraphBuilder *pGraph;
// Create the Filter Graph Manager.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void**)&pGraph);
// This example omits error handling.
// Not shown: Use the System Device Enumerator to create the
// audio capture filter.
// Add the audio capture filter to the filter graph.
hr = pGraph->AddFilter(pSrc, L"Capture");
// Add the WavDest and the File Writer.
hr = AddFilterByCLSID(pGraph, CLSID_WavDest, L"WavDest", &pWaveDest);
hr = AddFilterByCLSID(pGraph, CLSID_FileWriter, L"File Writer", &pWriter);
// Set the file name.
hr = pWriter->QueryInterface(IID_IFileSinkFilter, (void**)&pSink);
hr = pSink->SetFileName(L"C:\\MyWavFile.wav", NULL);
// Connect the filters.
hr = ConnectFilters(pGraph, pSrc, pWaveDest);
hr = ConnectFilters(pGraph, pWaveDest, pWriter);
// Not shown: Release interface pointers.
В этом примере используется функция, описанная в разделе "Добавление фильтра по CLSID" и функция, описанная ConnectFilters
в разделе "Подключение двух фильтров".AddFilterByCLSID
Ни из них не является API DirectShow.
См. также