Создание графа записи звука
[Функция, связанная с этой страницей, DirectShow — это устаревшая функция. он был заменен MediaPlayer, IMFMediaEngine и захватом аудио/видео в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать код с MediaPlayer, IMFMediaEngine и захватом аудио/видео в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Первым шагом для приложения записи звука является создание графа фильтров. Конфигурация графа зависит от типа файла, который требуется создать.
- Файл AVI только аудио: фильтр захвата аудио к фильтру AVI Mux, и AVI Mux к фильтру записи файлов.
- WAV-файл: фильтр захвата аудио — в образец фильтра WavDest — в фильтр записи файлов
- Файл Windows Media Audio (.wma): фильтр захвата звука к фильтру WM ASF Writer.
Фильтр WavDest предоставляется в качестве примера пакета SDK. Чтобы использовать его, необходимо создать и зарегистрировать фильтр.
Чтобы использовать фильтр записи ASF, необходимо установить пакет SDK для Windows Media и получить ключ программного обеспечения для разблокировки фильтра. Дополнительные сведения см. в разделе "Использование Windows Media" в DirectShow.
Вы можете создать граф фильтров с помощью объекта Capture Graph Builder или создать граф вручную. Это значит, что приложение автоматически добавляет и подключает каждый фильтр. В этой статье описывается ручной подход. Дополнительные сведения об использовании построителя графов захвата см. в разделе "Запись видео". Большая часть информации в этой статье относится к графам, предназначенным исключительно для аудио.
Добавление устройства записи звука
Так как фильтр записи звука взаимодействует с определенным аппаратным устройством, невозможно просто вызвать CoCreateInstance для создания фильтра. Вместо этого используйте перечислитель системных устройств для перечисления всех устройств в категории "Источники записи звука", которая определяется идентификатором класса CLSID_AudioInputDeviceCategory.
Перечислитель системных устройств возвращает список монников для устройств; удобное для восприятия имя каждого монника соответствует имени устройства. Выберите один из возвращенных моникеров и используйте его для создания экземпляра фильтра записи звука для этого устройства. Добавьте фильтр в граф фильтров. Предпочтительное звуковое устройство пользователя отображается первым в списке устройств. (Пользователь выбирает предпочтительное устройство, нажав Звуки и Мультимедиа в Панели управления.)
Дополнительные сведения см. в разделе "Использование перечислителя системных устройств".
Чтобы указать, откуда захватывать входной сигнал, получите интерфейс IAMAudioInputMixer из фильтра захвата аудио и вызовите метод put_Enable, чтобы обозначить вход. Однако одним из ограничений этого метода является то, что разные аппаратные устройства могут использовать разные строки для идентификации входных данных. Например, одна карточка может использовать "Микрофон" для идентификации входа микрофона, а другая карта может использовать "Мик". Чтобы определить идентификатор строки для заданных входных данных, используйте функции Windows Multimedia waveOutOpen, mixerOpen и mixerGetLineInfo. См. Запросы устройств микшера для получения дополнительной информации.
Добавление мультиплексера и модуля записи файлов
Граф записи звука должен содержать мультиплексор и модуль записи файлов.
Мультиплексор — это фильтр, который объединяет один или несколько потоков в один поток с определенным форматом. Например, фильтр AVI Mux объединяет звуковые и видеопотоки в чередуемый поток AVI. Для записи звука обычно существует только один аудиопоток, но звуковые данные по-прежнему должны быть упаковлены в формат, который можно сохранить на диске, который требует мультиплексера. Выбор мультиплексера зависит от целевого формата:
- AVI: мультиплексер AVI
- WAV: ВавДест
- 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.
В этом примере используется функция, описанная в разделе "Добавление фильтра по CLSIDConnectFilters
Ни из них не является API DirectShow.
Связанные темы