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

Вниз

Изменение размера изображения при видеозахвате.   Найти похожие ветки 

 
Devider ©   (2006-04-26 11:01) [0]

Здравствуйте, Мастера, требуется ваша помощь!
Захватываю изображение с камеры. В качестве примера чтобы разобраться взял пример ASF Capture из DsPack. Изображение получается по умолчанию 320*240 (на глазок). Необходимо выставить большее (хотелось бы 720*576 или хотябы 640*480)
Делаю это таким способом:

procedure TVideoForm.SetPixelFormat(x, y: integer);
var fBuilder : ICaptureGraphBuilder2;
   fCapStreamConf :IAMStreamConfig;
   CapCount,CapSize,i:integer;
   currentMediaType:PAMMediaType;
   currentconfigcaps: VIDEO_STREAM_CONFIG_CAPS;
   result:HRESULT;

function IsMatchedConfigcaps(const Caps: VIDEO_STREAM_CONFIG_CAPS; const MediaType:PAMMediaType;SizeX,SizeY:Integer):boolean;
begin
 Result:=//IsEqualGUID(MediaType.majortype, VSC_Mediatype) and
         //((IsEqualGUID(MediaType.subtype,MEDIASUBTYPE_RGB24)            //or IsEqualGUID(MediaType.subtype,MEDIASUBTYPE_RGB32)));
         true;

  if result then
    Result:=(SizeX>=caps.MinOutputSize.cx) and  (SizeX<=caps.MaxOutputSize.cx) and
    (SizeY>=caps.MinOutputSize.cy) and  (SizeY<=caps.MaxOutputSize.cy);
end;

begin
 with FilterGraph as ICaptureGraphBuilder2 do
 begin
    if (Succeeded(FindInterface(@PIN_CATEGORY_CAPTURE,
                          @MEDIATYPE_Interleaved,
                          Filter as IBaseFilter,
                          IID_IAMStreamConfig,
                          fCapStreamConf))) then ShowMessage ("Interleaved");
//   не Interleaved поэтому идем дальше
    if (Succeeded(FindInterface(@PIN_CATEGORY_CAPTURE,
                          @MEDIATYPE_VIDEO,
                          Filter as IBaseFilter,
                          IID_IAMStreamConfig,
                          fCapStreamConf))) then ShowMessage ("Video");
 
   fCapStreamConf.GetNumberOfCapabilities(CapCount,CapSize);

   for I:=0 to CapCount-1 do begin  
     fCapStreamConf.GetStreamCaps(i,currentMediaType,currentconfigcaps);

     if not IsMatchedConfigcaps(currentconfigcaps, CurrentMediaType, x, y)
     then exit;
     ShowMessage("IsMatchedConfigcaps = true");
     with  CurrentMediaType^ do begin

       if IsEqualGUID(formattype,FORMAT_VideoInfo)
       then with pvideoInfoHeader(pbFormat)^ do  begin
            rcTarget:=Bounds(0,0,abs(X),abs(Y));
            bmiHeader.biWidth:=X;
            bmiHeader.biHeight:=Y;
        end
       else if IsEqualGUID(formattype,FORMAT_VideoInfo2)
       then with pvideoInfoHeader2(pbFormat)^ do  begin
          rcTarget:=Bounds(0,0,abs(X),abs(Y));
          bmiHeader.biWidth:=X;
          bmiHeader.biHeight:=Y;
         end
       else begin
         DeleteMediaType(currentmediaType);
         continue;  
       end;
       result:=fCapStreamConf.SetFormat(currentmediaType^);
     end; // matched mediatype
     DeleteMediaType(currentmediaType);
     if Succeeded(Result) then begin
       break;
       ShowMessage("Урряяя!!!");
     end;
   end;
 end;
end;

Проблема в том, что не срабатывает fCapStreamConf.SetFormat(), тоесть этого "Урряяя!!" я не вижу. Не могу понять почему. Помогите, пожалуйста, мастера! Мож у кого готовый пример есть... Буду благодарен за любую мысль!


 
WondeRu ©   (2006-04-27 14:16) [1]

в твое писанине, чтот не разобрался... я вот так делал:

procedure TVideoCapture.SetStreamConfig;
Var
 hr                  : HRESULT;
 pmt                 : PAMMediaType;
begin
 hr := (FFilterGraph as ICaptureGraphBuilder2).FindInterface(@PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video, FFilter as IBaseFilter, IID_IAMStreamConfig, pVideoStreamConfig);
 if (hr <> NOERROR) Then raise Exception.Create("Unable create instance of IAMStreamConfig");

 hr := pVideoStreamConfig.GetFormat(pmt);        // current capture format
 if (hr <> NOERROR) Then
 Begin
   pVideoStreamConfig := Nil;
   raise Exception.Create("Unable get stream video format");
 End;

 VIDEOINFOHEADER(pmt.pbFormat^).bmiHeader.biWidth  := ImageWidth;
 VIDEOINFOHEADER(pmt.pbFormat^).bmiHeader.biHeight := ImageHeight;
 hr := pVideoStreamConfig.SetFormat(pmt^);
 if (hr <> NOERROR) then raise Exception.Create("Unable set stream video format");
end;



 
Devider ©   (2006-04-27 15:32) [2]

Я ее вот так чуток переделал.

function TVideoForm.SetStreamConfig(ImageWidth, ImageHeight: integer):boolean;
Var
hr                  : HRESULT;
pmt                 : PAMMediaType;
pVideoStreamConfig  : IAMStreamConfig;

begin
hr := (FilterGraph as ICaptureGraphBuilder2).FindInterface(@PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video, Filter as IBaseFilter, IID_IAMStreamConfig, pVideoStreamConfig);
if (hr <> NOERROR) Then raise Exception.Create("Unable create instance of IAMStreamConfig");

hr := pVideoStreamConfig.GetFormat(pmt);        // current capture format
if (hr <> NOERROR) Then
Begin
  pVideoStreamConfig := Nil;
  raise Exception.Create("Unable get stream video format");
End;

VIDEOINFOHEADER(pmt.pbFormat^).bmiHeader.biWidth  := ImageWidth;
VIDEOINFOHEADER(pmt.pbFormat^).bmiHeader.biHeight := ImageHeight;
hr := pVideoStreamConfig.SetFormat(pmt^);
Result := true;
if (hr <> NOERROR) then result := false;

end;

Вызываю так (так ли надо?)
FilterGraph.Stop;
if SetStreamConfig(88,72) then ShowMessage("true");
FilterGraph.Play;

"true" я получаю, а картинка не меняется. Что я делаю не так?

Если разрешение поставить больше чем то, что у меня по умолчанию (320*240 вроде) получаю true, а на
FilterGraph.Play;
получаю:
-----------------
Project ASFCap.exe raised exception class EDirectShowException with message "Неопознанная ошибка  ($80004005).". Process stopped. Use Step or Run to continue.
-----------------


 
Devider ©   (2006-04-27 23:36) [3]

Фсе, разобрался вроде! Спасибо!



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

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

Наверх




Память: 0.47 MB
Время: 0.043 c
15-1164098531
syte_ser78
2006-11-21 11:42
2006.12.10
Помогите с КПК


15-1164201936
ПЛОВ
2006-11-22 16:25
2006.12.10
Уровни вложенности папок


15-1164271599
wamp
2006-11-23 11:46
2006.12.10
cmd


1-1161710150
7D7
2006-10-24 21:15
2006.12.10
Как узнать объем памяти для данных?


2-1164362418
Xmen
2006-11-24 13:00
2006.12.10
Форма поверх всех других приложений





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский