Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Media";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.036 c
15-1179855437
Cerberus
2007-05-22 21:37
2007.06.24
Firewall


8-1160027808
DevilDevil
2006-10-05 09:56
2007.06.24
TBitmap и Альфаканал


2-1180736356
Ламер 2.ХХ
2007-06-02 02:19
2007.06.24
ПК в сети


15-1179773449
Астроном
2007-05-21 22:50
2007.06.24
Фотография воды на Марсе...


15-1180521426
lopi
2007-05-30 14:37
2007.06.24
Как это делается?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский