Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bekomm immer Fehlermeldung:Schnittstelle nicht unterstützt (https://www.delphipraxis.net/12354-bekomm-immer-fehlermeldung-schnittstelle-nicht-unterstuetzt.html)

chris_82 25. Nov 2003 21:49


Bekomm immer Fehlermeldung:Schnittstelle nicht unterstützt
 
Schreib grad an nem Proggi zum darstellen eines Bildes einer Webcam, mittels DirectShow, verwende dazu das DSPack.

Möchte verschiedene Klassen verwenden. Bekomm nun aber beim initialisieren des Bildes immer ne Zugriffsverletzung, aber zu compilieren gehts? Woran kann das liegen?

Poste hier mal die beiden Klassen:

Hier die Klasse des Form:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,unit2, StdCtrls, DSPack;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    VideoWindow1: TVideoWindow;
    procedure FormCreate(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  capsource:tcapsource;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
capsource:=TCapSource.Create;
if capsource.GetDevices.Count > 0 then
 begin
  for i:=0 to capsource.GetDevices.Count-1 do
    Listbox1.Items.Add(capsource.GetDevices.Strings[i]);
 end
else
 begin
  Listbox1.Items.Add('Keine Videoquelle verfügbar!');
  Listbox1.Enabled:=False;
 end;
end;



procedure TForm1.ListBox1Click(Sender: TObject);
begin
Capsource.StartCapture(Listbox1.ItemIndex, VideoWindow1)
end;

end.
Hier die der Webcam:

Delphi-Quellcode:
unit Unit2;

interface

uses DSPack,DSUtil,DirectShow9,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type TCapSource = class
 function GetDevices:TStringList;
 procedure StartCapture(Lbindex:integer; VideoWindow:TVideoWindow);
private
 FDevices:TStringlist;
published
 property Devices:TStringlist read GetDevices;
end;

var capenum:TSysDevEnum;
    FilterGraph:TFilterGraph;
    Filter:Tfilter;
    SampleGrabber:TSampleGrabber;
implementation

function TCapSource.GetDevices:TStringList;
var i:integer;
DeviceListe:TStringList;
begin
  Deviceliste:=TStringlist.Create;
  Capenum:=TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
  for i:=0 to Capenum.CountFilters - 1 do
   DeviceListe.Add(Capenum.Filters[i].FriendlyName);
   GetDevices:=Deviceliste;
end;

procedure TCapSource.StartCapture(Lbindex:integer; VideoWindow:TVideoWindow);
begin
Filtergraph.ClearGraph;
Filtergraph.Active:=False;
Filter.BaseFilter.Moniker := Capenum.GetMoniker(Lbindex);
FilterGraph.Active := True;
with Filtergraph as ICaptureGraphBuilder2 do
 RenderStream (@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter,
 SampleGrabber as IBaseFilter, VideoWindow as IBaseFilter);
 FilterGraph.Play;
end;

end.

scp 25. Nov 2003 23:20

Re: Bekomm immer eine Zugriffsverletzung
 
Ich würde sagen, das liegt an der Device-Liste, dabei hast dudoch schon eine so schöne Variable dafür: FDevices. Ich würde mal folgendes ändern.

Delphi-Quellcode:
function TCapSource.GetDevices:TStringList;
var i:integer;
begin
  If Assigned(FDevices) then
    FreeAndNil(FDevices);

  FDevices := TStringlist.Create;
  Capenum := TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
  for i := 0 to Capenum.CountFilters - 1 do
    FDevices.Add(Capenum.Filters[i].FriendlyName);

  result := FDevices;
end;
Ausserdem solltest du noch einen constructor erstellen:

Delphi-Quellcode:
TCapSource = class
  // ...
public
  constructor Create;
  // ...
end;
Delphi-Quellcode:
constructor TCapSource.Create;
begin
  inherited;

  FDevices := nil;
end;

PS: Deine Zugriffsverletzung kommt wohl dadurch, das DeviceListe ja innherhalb der Funktion deklariert ist und deshalb nach dem Abschluss der Funktion wieder freigegeben wird.

chris_82 26. Nov 2003 08:22

Re: Bekomm immer eine Zugriffsverletzung
 
Danke für den Tipp mit dieser Procedure Get Devices, ich denk mal so ist es die bessere Lösung, aber daran liegts nicht.

Aber ich hab vergessen die Klassen Filtergraph, Filter und SampleGrabber zu initialisieren. Daran wird es wohl liegen, da ich ja auf etwas zugreife was noch gar nicht im Speicher vorhanden ist.
Hab ich nun gemacht, aber die Methode Create möchte immer noch einen Parameter vom Typ TComponent übergeben habe.

Ich denk ja mal da muss ich das VideoWindow übergeben, oder lieg ich da falsch?

Habs jedenfalls mal versucht:

Delphi-Quellcode:
procedure TCapSource.StartCapture(Lbindex:integer; VideoWindow:TVideoWindow);
begin
  Filtergraph:=TFiltergraph.Create(VideoWindow);
  Filter:=TFilter.Create(VideoWindow);
  SampleGrabber:=TSampleGrabber.Create(VideoWindow);
  Filtergraph.ClearGraph;
  Filtergraph.Active:=False;
  Filter.BaseFilter.Moniker := Capenum.GetMoniker(Lbindex);
  FilterGraph.Active := True;

  with Filtergraph as ICaptureGraphBuilder2 do
   RenderStream (@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter,
   SampleGrabber as IBaseFilter, VideoWindow as IBaseFilter);
   FilterGraph.Play;
end;
Aber nun bekomme ich an der Stelle

Delphi-Quellcode:
 with Filtergraph as ICaptureGraphBuilder2 ...
eine Exception, die sagt Schnittstelle nicht unterstützt.

chris_82 26. Nov 2003 13:07

Re: Bekomm immer eine Zugriffsverletzung
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, hab grad auch noch mal versucht, die Filtergraph, Filter und Sampelgrabber nicht in der Klasse CapSource zu instanziieren, sondern in der Klasse form1 (also einfach die komponenten auf das Form gezogen), obwohl ich die andere möglichkeit besser finden würde, aufgrund der wiederverwendbarkeit...., aber bekomme immer noch den selben fehler

häng den code mal als attachment an.

scp 26. Nov 2003 13:07

Re: Bekomm immer eine Zugriffsverletzung
 
Tu mal direkt nach dem erstellen folgende Zeilen einfügen:

Delphi-Quellcode:
Filtergraph.GraphEdit := true;
Filtergraph.Mode := gmCapture;

scp 26. Nov 2003 14:08

Re: Bekomm immer Fehlermeldung:Schnittstelle nicht unterstüt
 
So, hab dein Projekt getestet und den Fehler gefunden: Wenn du im Designmode beim VideoWindow den Filtergraph angibts, dann gehts.

chris_82 26. Nov 2003 20:32

Re: Bekomm immer Fehlermeldung:Schnittstelle nicht unterstüt
 
ich glaub ich versteh dich grad nicht ganz, kannst du mal zeigen was genau du meinst?

scp 27. Nov 2003 01:14

Re: Bekomm immer Fehlermeldung:Schnittstelle nicht unterstüt
 
Wenn du in Delphi das VideoWindow anklickst, erscheint bei den Eigenschaften im Objektinspektor die Eigenschaft "FilterGraph". Wenn du dort auf den Pfeil klickst, kannst du denn Filtergraph, der auf der Form ist, auswählen.
Das gleiche musst du auch beim SampleGrabber machen: SampleGrabber anklicken und im OI den Filtergraph auswählen.

chris_82 27. Nov 2003 08:54

Re: Bekomm immer Fehlermeldung:Schnittstelle nicht unterstüt
 
Mh, hab ich gemacht, bekomm aber immer noch den selben fehler, kannst du das abgeänderte projekt mal als Attachement anhängen?

chris_82 27. Nov 2003 09:35

Re: Bekomm immer Fehlermeldung:Schnittstelle nicht unterstüt
 
Ok, jetzt gehts doch. Danke dir erst mal für die große Hilfe :thuimb: , ich glaub da wär ich selbst nie drauf gekommen :pale: .

Aber ich denk ich werde im Laufe des Projekts sicher noch einige Fragen haben :spin2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz