Форум: "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