Страницы свойств. Аглоритм работы с устройствами

Источник: 
"DirectX и Delphi. 
Разработка графических и 
мультимедийных приложений"

Страницы свойств

Прежде чем начать запись звука или изображения, было бы неплохо настроить ряд параметров для улучшения их качества, либо наоборот, уменьшить качество с целью экономии места на диске.

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

function OleCreatePropertyFrame(
hwndOwner: HWnd;
x,y: Integer;
lpszCaption: POleStr;
cObjects: Integer;
pObjects: Pointer;
cPages: Integer;
pPageCLSIDs: Pointer;
lcid: TLCID;
dwReserved: Longint;
pvReserved: Pointer): HResult; stdcall;

  • hwndOwner– дескриптор родительского окна для страницы свойств;
  • x– зарезервировано;
  • y– зарезервировано;
  • lpszCaption– строка, которая будет использована в заголовке страницы свойств;
  • cObjects– количество указателей на объекты, которые будут переданы в параметре pObjects;
  • pObjects– массив указателей IUnknown на объекты, для которых должна быть вызвана страница свойств;
  • cPages– количество страниц свойств, определенных в pPageCLSIDs;
  • pPageCLSIDs– массив размера cPages, содержащий идентификаторы класса (CLSID)для каждой страницы свойств;
  • lcid– идентификатор текущих локальных установок;
  • dwReserved– зарезервировано, должно быть нулевым;
  • pvReserved– зарезервировано, должно быть нулевым.

Не каждый фильтр имеет страницу свойств. Проверить это достаточно просто – нужно лишь попытаться получить интерфейс ISpecifyPropertyPagesдля фильтра:

Result := Filter.QueryInterface(ISpecifyPropertyPages, PropertyPages);

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

Алгоритм работы

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

1.Создаем объект для построения графа фильтров:

Result := CoCreateInstance(CLSID_FilterGraph, NIL,
CLSCTX_INPROC_SERVER, IID_IGraphBuilder, FGraphBuilder);

2.Создаем объект для построения графа захвата:

Result := CoCreateInstance(CLSID_CaptureGraphBuilder2, NIL,
CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2,
FCaptureGraphBuilder);

3.Задаем граф фильтров для использования в построении графа захвата:

Result := FCaptureGraphBuilder.SetFiltergraph(FGraphBuilder);

4.Получаем фильтры захвата и сжатия исходя из их имен:

FVideoCaptureFilter := EnumerateDevices(CLSID_VideoInputDeviceCategory,
VideoCaptureDeviceName, NIL, TRUE);

FAudioCaptureFilter := EnumerateDevices(CLSID_AudioInputDeviceCategory,
AudioCaptureDeviceName, NIL, TRUE);

FVideoCompressFilter := EnumerateDevices(CLSID_VideoCompressorCategory,
VideoCompressDeviceName, NIL, TRUE);

FAudioCompressFilter := EnumerateDevices(CLSID_AudioCompressorCategory,
AudioCompressDeviceName, NIL, TRUE);

5.Добавляем полученные фильтры в граф:

// Добавляем фильтр захвата видео в граф
if FVideoCaptureFilter <> NIL then
begin
FGraphBuilder.AddFilter(FVideoCaptureFilter, 'VideoCaptureFilter');
end;

// Добавляем фильтр захвата звука в граф
if FAudioCaptureFilter <> NIL then
begin
FGraphBuilder.AddFilter(FAudioCaptureFilter, 'AudioCaptureFilter');
end;

// Добавляем фильтр сжатия видео в граф
if FVideoCompressFilter <> NIL then
begin
FGraphBuilder.AddFilter(FVideoCompressFilter, 'VideoCompressFilter');
end;

// Добавляем фильтр сжатия звука в граф
if FAudioCompressFilter <> NIL then
begin
FGraphBuilder.AddFilter(FAudioCompressFilter, 'AudioCompressFilter');
end;

6.Строим граф захвата в зависимости от флагов захвата и предварительного просмотра, задаем формат выходных данных:

Result := FCaptureGraphBuilder.RenderStream(@PIN_CATEGORY_PREVIEW,
@MEDIATYPE_Video, FVideoCaptureFilter, NIL, NIL);

Result := FCaptureGraphBuilder.RenderStream(@PIN_CATEGORY_PREVIEW,
@MEDIATYPE_Audio, FAudioCaptureFilter, NIL, NIL);

Result := FCaptureGraphBuilder.SetOutputFileName(MEDIASUBTYPE_Avi,
PWideChar(FCaptureFileName), FMux, FSink);

Result := FCaptureGraphBuilder.RenderStream(@PIN_CATEGORY_CAPTURE,
@MEDIATYPE_Video, FVideoCaptureFilter, FVideoCompressFilter, FMux);

Result := FCaptureGraphBuilder.RenderStream(@PIN_CATEGORY_CAPTURE,
@MEDIATYPE_Audio, FAudioCaptureFilter, FAudioCompressFilter, FMux);

7.Запускаем графа захвата:

Result := FMediaControl.Run();

8.Освобождаем выделенную память.

 

Comments