![]() |
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:
Hier die der Webcam:
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.
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. |
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:
Ausserdem solltest du noch einen constructor erstellen:
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;
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. |
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:
Aber nun bekomme ich an der Stelle
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;
Delphi-Quellcode:
eine Exception, die sagt Schnittstelle nicht unterstützt.
with Filtergraph as ICaptureGraphBuilder2 ...
|
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. |
Re: Bekomm immer eine Zugriffsverletzung
Tu mal direkt nach dem erstellen folgende Zeilen einfügen:
Delphi-Quellcode:
Filtergraph.GraphEdit := true;
Filtergraph.Mode := gmCapture; |
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.
|
Re: Bekomm immer Fehlermeldung:Schnittstelle nicht unterstüt
ich glaub ich versteh dich grad nicht ganz, kannst du mal zeigen was genau du meinst?
|
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. |
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?
|
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 04:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz