AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bekomm immer Fehlermeldung:Schnittstelle nicht unterstützt

Bekomm immer Fehlermeldung:Schnittstelle nicht unterstützt

Ein Thema von chris_82 · begonnen am 25. Nov 2003 · letzter Beitrag vom 27. Nov 2003
Antwort Antwort
chris_82

Registriert seit: 26. Aug 2003
112 Beiträge
 
Delphi 6 Enterprise
 
#1

Bekomm immer Fehlermeldung:Schnittstelle nicht unterstützt

  Alt 25. Nov 2003, 21:49
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.
....oop und nun...??
http://www.sengewald.info
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#2

Re: Bekomm immer eine Zugriffsverletzung

  Alt 25. Nov 2003, 23:20
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.
  Mit Zitat antworten Zitat
chris_82

Registriert seit: 26. Aug 2003
112 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Bekomm immer eine Zugriffsverletzung

  Alt 26. Nov 2003, 08:22
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

 with Filtergraph as ICaptureGraphBuilder2 ... eine Exception, die sagt Schnittstelle nicht unterstützt.
....oop und nun...??
http://www.sengewald.info
  Mit Zitat antworten Zitat
chris_82

Registriert seit: 26. Aug 2003
112 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Bekomm immer eine Zugriffsverletzung

  Alt 26. Nov 2003, 13:07
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.
Angehängte Dateien
Dateityp: rar webcam.rar (8,9 KB, 21x aufgerufen)
....oop und nun...??
http://www.sengewald.info
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#5

Re: Bekomm immer eine Zugriffsverletzung

  Alt 26. Nov 2003, 13:07
Tu mal direkt nach dem erstellen folgende Zeilen einfügen:

Delphi-Quellcode:
Filtergraph.GraphEdit := true;
Filtergraph.Mode := gmCapture;
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#6

Re: Bekomm immer Fehlermeldung:Schnittstelle nicht unterstüt

  Alt 26. Nov 2003, 14:08
So, hab dein Projekt getestet und den Fehler gefunden: Wenn du im Designmode beim VideoWindow den Filtergraph angibts, dann gehts.
  Mit Zitat antworten Zitat
chris_82

Registriert seit: 26. Aug 2003
112 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: Bekomm immer Fehlermeldung:Schnittstelle nicht unterstüt

  Alt 26. Nov 2003, 20:32
ich glaub ich versteh dich grad nicht ganz, kannst du mal zeigen was genau du meinst?
....oop und nun...??
http://www.sengewald.info
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#8

Re: Bekomm immer Fehlermeldung:Schnittstelle nicht unterstüt

  Alt 27. Nov 2003, 01:14
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.
  Mit Zitat antworten Zitat
chris_82

Registriert seit: 26. Aug 2003
112 Beiträge
 
Delphi 6 Enterprise
 
#9

Re: Bekomm immer Fehlermeldung:Schnittstelle nicht unterstüt

  Alt 27. Nov 2003, 08:54
Mh, hab ich gemacht, bekomm aber immer noch den selben fehler, kannst du das abgeänderte projekt mal als Attachement anhängen?
....oop und nun...??
http://www.sengewald.info
  Mit Zitat antworten Zitat
chris_82

Registriert seit: 26. Aug 2003
112 Beiträge
 
Delphi 6 Enterprise
 
#10

Re: Bekomm immer Fehlermeldung:Schnittstelle nicht unterstüt

  Alt 27. Nov 2003, 09:35
Ok, jetzt gehts doch. Danke dir erst mal für die große Hilfe , ich glaub da wär ich selbst nie drauf gekommen .

Aber ich denk ich werde im Laufe des Projekts sicher noch einige Fragen haben
....oop und nun...??
http://www.sengewald.info
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:01 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