Q&A

  • DSPACK234 에서 D5 용 VMR 사용 샘플도움 부탁드립니다
이쪽은 처음이라 많이 힘드네요

VMR 관련 테스트해보신분께

테스트자료 도움좀받고자 합니다.

D5 사용하고 있구요 버전별로

VMR Demo 는 있는데 D5 은 없어서

(아직 요령을 몰라서..그렇겠지요)

도움을 요청합니다.
3  COMMENTS
  • Profile
    KDDG_Gnoses 2005.01.18 01:03
    D7용 을 조금 손보시면 되지 않을까요?

    제가 D5가 없기때문에 해보진 못하지만, 그렇게 어렵지 않은데...

    TVideoWindow의 mode 속성을 vmr로 바꾸시고,

    TVMRBitmap 생성하셔서 colorkey 설정하고

    Draw 해주면 될것 같습니다만...
  • Profile
    박종삼 2005.01.18 19:26


    답변고맙습니다.

    나름대로해보았지만 역시 실력이 문제네요..

    아래는 D6-D7 데모에있는  VMRBitmap    을 D5 로 컴파일 했더니
    컴파일 에러는 안나오는데  실행시 뭔내용인지 잘모르겠네요
    한번만 봐주세요.. 실행그림은 그림으로..


    unit main;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, DSUtil, StdCtrls, DSPack, DirectShow9, Menus, ExtCtrls;

    type


      TVideoForm = class(TForm)
        FilterGraph: TFilterGraph;
        VideoWindow: TVideoWindow;
        MainMenu1: TMainMenu;
        Devices: TMenuItem;
        Filter: TFilter;
        Blend1: TMenuItem;
        ext1: TMenuItem;
        Bitmap1: TMenuItem;
        OpenDialog: TOpenDialog;
        procedure FormCreate(Sender: TObject);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure FormDestroy(Sender: TObject);
        procedure ext1Click(Sender: TObject);
        procedure Bitmap1Click(Sender: TObject);
      private
        { D?larations priv?s }
      public
        { D?larations publiques }
        VMRBitmap: TVMRBitmap;
        procedure OnSelectDevice(sender: TObject);

      end;

    var
      VideoForm: TVideoForm;
      SysDev: TSysDevEnum;
    implementation

    uses Math;

    {$R *.dfm}

    procedure TVideoForm.FormCreate(Sender: TObject);
    var
      i: integer;
      Device: TMenuItem;
    begin
      SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
      if SysDev.CountFilters > 0 then
        for i := 0 to SysDev.CountFilters - 1 do
        begin
          Device := TMenuItem.Create(Devices);
          Device.Caption := SysDev.Filters[i].FriendlyName;
          Device.Tag := i;
          Device.OnClick := OnSelectDevice;
          Devices.Add(Device);
        end;
      VMRBitmap:= TVMRBitmap.Create(VideoWindow);
    end;

    procedure TVideoForm.OnSelectDevice(sender: TObject);
    var FG :ICaptureGraphBuilder2 ;
        Fr :IBaseFilter;
        VW :IbaseFilter;
    begin
      FilterGraph.ClearGraph;
      FilterGraph.Active := false;
      Filter.BaseFilter.Moniker :=SysDev.GetMoniker(0); //SysDev.GetMoniker(TMenuItem(Sender).tag);
      FilterGraph.Active := true;

      //바꾼내용

      with FG do
        CheckDSError(
        RenderStream(@PIN_CATEGORY_PREVIEW , nil, FR, nil, VW));
        FilterGraph.Play;

      //원내용
    with FilterGraph as ICaptureGraphBuilder2 do
        CheckDSError(RenderStream(@PIN_CATEGORY_PREVIEW , nil, Filter as IBaseFilter, nil, VideoWindow as IbaseFilter));
      FilterGraph.Play;


    end;

    procedure TVideoForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      SysDev.Free;
      FilterGraph.ClearGraph;
      FilterGraph.Active := false;
    end;

    procedure TVideoForm.FormDestroy(Sender: TObject);
    begin
      VMRBitmap.Free;
    end;

    procedure TVideoForm.ext1Click(Sender: TObject);
    begin
      with VMRBitmap, Canvas do
      begin
        LoadEmptyBitmap(300,200,pf24bit, clSilver);
        Source := VMRBitmap.Canvas.ClipRect;
        Options := VMRBitmap.Options + [vmrbSrcColorKey];
        ColorKey := clSilver;
        Brush.Color := clSilver;
        Font.Color := clWhite;
        Font.Style := [fsBold];
        Font.Size := 30;
        Font.Name := 'Arial';
        TextOut(0,0,'Hello Word :)');
        DrawTo(0,0,1,1,0.5);
      end;
    end;

    procedure TVideoForm.Bitmap1Click(Sender: TObject);
    var Bitmap: TBitmap;
    begin
      if OpenDialog.Execute then
      Begin
        Bitmap:= TBitmap.Create;
        try
          Bitmap.LoadFromFile(OpenDialog.FileName);
          VMRBitmap.LoadBitmap(Bitmap);
          VMRBitmap.Source := VMRBitmap.Canvas.ClipRect;
          VMRBitmap.DrawTo(0,0,0.5,0.5, 0.5);
        finally
          Bitmap.Free;
        end;
      end;

    end;








    end.







  • Profile
    박상윤 2005.01.21 21:12
    with FG do
        CheckDSError(
        RenderStream(@PIN_CATEGORY_PREVIEW , nil, FR, nil, VW));
        FilterGraph.Play;


    6나 7에서 as operator 씌여 것은.. QueryInterface 사용하여 임터페이스를 얻은후
    사용하셔야 합니다.

    CaptureGraphBuilder2: ICaptureGraphBuilder2;

    ...

    FG .QueryInterface (IID_ICaptureGraphBuilder2,CaptureGraphBuilder2);

    with CaptureGraphBuilder2 do
        CheckDSError(
        RenderStream(@PIN_CATEGORY_PREVIEW , nil, FR, nil, VW));


    대충 이런 내용이 되겠지여 ^^
    이게 원래 COM 프로그램 의 전형적인 코딩 방식이져
    6이상에선  as 를 사용하여.. 이를 줄일 수 있도록 되었습니다.
    그럼... 참고하세여