Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.24;
Скачать: CL | DM;

Вниз

Direct show: как узнать возможные частоты кадров у веб камеры?   Найти похожие ветки 

 
NeyroSpace ©   (2006-09-27 12:18) [0]

в ф-ции GetMediaTypeDescription() из DSPack есть информация о формате, но ничего нет про возможные частоты.
Однако при отображении свойств камеры (ShowPinPropertyPage()) там есть возможность выбора дискретных значений вроде 6, 12, 15, 20, 25, 30, значит они где-то перечислены.
Вопрос в том где?


 
Sambrook ©   (2006-09-27 15:26) [1]

В DirectShow есть интерфейс IAMStreamConfig с методом GetStreamCaps.
Есть ли он в DSPack - не знаю.


 
Neyro   (2006-10-06 09:34) [2]

Не совсем понимаю как этот интерфейс привязать к веб-камере...


 
NeyroSpace ©   (2006-10-06 10:12) [3]

у интерфейса IAMVideoControl есть метод GetFrameRateList

The IAMVideoControl interface controls certain video capture operations such as enumerating available frame rates and image orientation.

Вроде бы то, что надо, но поиск в рунете по слову IAMVideoControl да 0 результатов... его никто не использует?


 
SamBrook ©   (2006-10-06 10:13) [4]


FindResult:=Builder.FindInterface( @PIN_CATEGORY_CAPTURE,   @MEDIATYPE_VIDEO,  VCap,IID_IAMStreamConfig,CapStreamConf);

if Succeeded(FindResult) then ...


VCap - фильтр источника
CapStreamConf -  IAMStreamConfig
Build - ICaptureGraphBuilder2


 
NeyroSpace ©   (2006-10-06 11:46) [5]

Нет все-таки инстинкты не подвели)) именно IAMVideoControl выдает нужную информацию о возможных значениях частоты кадров устройства захвата.

uses
 DSPack, DSUtil...
...
var
 VideoMediaTypes: TEnumMediaType;//список возможных сред захвата(видео, аудио)
 SysDev: TSysDevEnum;//список устройств захвата
...
implementation
...

procedure TForm1.FormCreate(Sender: TObject);
var I: Integer;
   EnumMT: IEnumMediaTypes;
begin
GlobpBuffer := nil;
DevEnum := TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
VideoMediaTypes := TEnumMediaType.Create();

for I:=0 to DevEnum.CountFilters - 1 do
 begin
 cbxCameras.Items.Add(DevEnum.Filters[I].FriendlyName);
 end;
...
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 PinList: TPinList;
 AMVideoControl: IAMVideoControl;
 xySize: TSize;
 maxFrameRate: int64;
 i, FrameRateListIndexCount: integer;
 pFrameRateList: pInt64;
begin
//тут инициализация фильтров, что-то вроде

FilterGraph1.ClearGraph;
FilterGraph1.Active := false;
FilterGraph1.Mode := gmCapture;

VideoWindow1.FilterGraph := FilterGraph1;

if FilterGraph1.Active then
 begin
 FilterGraph1.Stop;
 FilterGraph1.Active:=false;
 end;

//выбираем устройство захвата (видео или звуковое)
Filter1.BaseFilter.Moniker := DevEnum.GetMoniker(cbxCameras.ItemIndex);

FilterGraph1.Active := true;
//получаем графический интерфейс DirectX
FilterGraph1.QueryInterface(ICaptureGraphBuilder2, CaptureGraph);

//определяем интерфейс устройства ввода
Filter1.QueryInterface(IBaseFilter, SourceFilter);

SampleGrabber1.MediaType := VideoMediaTypes.Items[cbxFormats.ItemIndex];
SampleGrabber1.UpdateMediaType;
SampleGrabber1.MediaType.AMMediaType.subtype := MEDIASUBTYPE_RGB24;

//определяем интерфейс промежуточного фильтра
SampleGrabber1.QueryInterface(IBaseFilter, SampleFilter);
//определяем интерфейс утройства вывода
VideoWindow1.QueryInterface(IBaseFilter, DestFilter);

//                                                    Web Camera    SampleGrabber1 VideoWindow1
CaptureGraph.RenderStream(@PIN_CATEGORY_CAPTURE, nil, SourceFilter, SampleFilter, DestFilter);

//собираем информацию о характеристиках устройства захвата
//в SourceFilter сейчас выбранное устройство, подключаемся к его интерфейсу, выдающему информацию об устройстве
SourceFilter.QueryInterface(IID_IAMVideoControl, AMVideoControl);

//далее чтобы воспользоваться AMVideoControl.GetFrameRateList()
//нужно знать текущее разрешение захвата

//докапываемся какое разрешение у нас выбрано из списка cbxFormats.ItemIndex
PinList := PinListForMoniker(DevEnum.GetMoniker(cbxCameras.ItemIndex));
try
 if PinList.Count <= 0 then exit;
 VideoMediaTypes.Assign(PinList.First);
 if IsEqualGUID(VideoMediaTypes.Items[cbxFormats.ItemIndex].formattype, FORMAT_VideoInfo) then
   begin
   with
//VideoMediaTypes.Items <- тут список возможных разрешений 320х240 и т.д. их я перечислил в cbxFormats
//поэтому одно из них уже выбрано cbxFormats.ItemIndex
PVideoInfoHeader(VideoMediaTypes.Items[cbxFormats.ItemIndex].AMMediaType.pbForma t)^.bmiHeader do
     begin
     xySize.cx := biWidth;//320
     xySize.cy := biHeight;//240
     //получаем максимальный FrameRate
     AMVideoControl.GetMaxAvailableFrameRate(PinList.First, cbxFormats.ItemIndex, xySize, maxFrameRate);
     Memo1.Lines.Add("Max FrameRate = " + inttostr(10000000 div maxFrameRate));
     //получаем список возможных FrameRate
     pFrameRateList := nil;
     AMVideoControl.GetFrameRateList(PinList.First, cbxFormats.ItemIndex, xySize, FrameRateListIndexCount, pFrameRateList);
     Memo1.Lines.Add("FrameRateListIndexCount = " + inttostr(FrameRateListIndexCount));
     for i := 0 to FrameRateListIndexCount - 1 do
       begin
       Memo1.Lines.Add("FrameRate = " + inttostr(10000000 div pFrameRateList^));
       inc(pFrameRateList);
       end;
     end;
   end;
finally
 PinList.Free;
end;
...
...

где
cbxCameras: TComboBox;
тут перечисляются устройства захвата при FormCreate

cbxFormats: TComboBox;
тут перечисляются режимы выбранного устройства. Сделать это можно посмотрев содержимое ф-ции function GetMediaTypeDescription() из модуля DUtils.

Единственное я не уверен в строчке VideoMediaTypes.Assign(PinList.First);
Всегда ли "Pin запись" следует первым?


 
NeyroSpace ©   (2006-10-06 12:36) [6]

Хотя у моей веб-камеры "Pin запись" вообще единственный Pin и других нет.
В любом случае лучше сделать перечисление Pin"ов.

Sambrook ©  спасибо за то что пытался помоч!


 
NeyroSpace ©   (2006-10-06 16:43) [7]

А да еще эта ф-ция понадобится:

function PinListForMoniker(Moniker: IMoniker): TPinList;
var
 BF: TBaseFilter;
 IBF: IBaseFilter;
begin
    BF := TBaseFilter.Create;
    try
       BF.Moniker := Moniker;
       IBF := BF.CreateFilter;
       Result := TPinList.Create(IBF);
    finally
       IBF := nil;
       BF.Free;
    end;
end;



Страницы: 1 вся ветка

Текущий архив: 2007.06.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
2-1179891332
Galiaf
2007-05-23 07:35
2007.06.24
Совместимость


15-1180059638
Slider007
2007-05-25 06:20
2007.06.24
С днем рождения ! 25 мая


15-1180502196
worldmen
2007-05-30 09:16
2007.06.24
Не устанавливаеться Delphi 5


11-1163236954
Vladimir Kladov
2006-11-11 12:22
2007.06.24
Версия 2.42


8-1160741982
@!!ex
2006-10-13 16:19
2007.06.24
Delphi + OpenGL + Web