Autor Beitrag
ma_sch
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 07.02.09 16:40 
Hey Leute,

ich möchte in mein Projekt ein Webcam-Interface einbauen.

Hab mich schon über die verschiedenen Methoden (VfW,DirectShow,VideoCap,JediVCl,DSPack usw) informiert und verfügbare Demos ausprobiert.

Solange ich diese mit Delphi 2006 abwärts erstellten Programme mit dem alten Design, auf der alten Form usw. in Delphi 2009 einfach nur öffne, kompilieren und laufen lasse, funktioniert die Mehrheit auch noch soweit ganz gut..

Sobald ich aber beginne, eigene Programme nach dem Vorbild der Demos mit 100%ig identischen Grundlagen in Delphi 2009 (neues Design,neue Form&Buttons usw..) zu erstellen, laufen die Programme nach wie vor, sie lassen sich ohne Fehler kompilieren, jedoch in keinem Fall ist das Bild der Webcam auf der Form zu sehen! Woran kann das liegen?!

Ich habe es sowohl mit der VideoCap/AviCap-Methode als auch mit der "Video for Windows" versucht, kein Erfolg. Die VideoCap/AviCap../VfW-Units waren in jedem Fall die originale aus den Sourcen der Demo-Proggis. Die externen Packs und Libraries habe ich mal noch außen vor gehalten, da diese denke ich mal eine aufwendigere Einarbeitung erfordern.

Bei den Testläufen ist mir aufgefallen, das in den Testläufen jeweils unterschiedliche Module unten in der "compiler-log-Anzeige" aktiv waren. Läuft das Programm im alten Stil und man startet das Video-Fenster,erscheint das Videobild der Webcam und im Logger unten steht: "Thread-Start: Thread-ID: 3776. Prozess VideoCapture.exe (5976)". Läuft das in Delphi 2009 erstellte Programm, heißt es dort: Modul laden: xvidcore.dll. Ohne Debug-Infos. Basisadresse: $04700000. Prozess SkinnerBox1p.exe (3824).
Hängt das Problem vllt mit den Xvid-/Video-Codecs allgemein zutun?
Oder liegt es doch an der Firewall?!

Ich poste mal noch meinen Code zum drüberschauen:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
unit SkinnerBox1u; 

interface 

uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls, ComCtrls, Menus, VfW, ExtCtrls; 

type 
  TForm1 = class(TForm) 
    VideoPanel1: TPanel; 
    Image1: TImage; 
    MainMenu1: TMainMenu; 
    Datei1: TMenuItem; 
    Optionen1: TMenuItem; 
    Info1: TMenuItem; 
    KameraTreiber1: TMenuItem; 
    N1: TMenuItem; 
    KameraBilder1: TMenuItem; 
    StatusBar1: TStatusBar; 
    KameraBedienung: TPanel; 
    KameraStart: TButton; 
    KameraStop: TButton; 
    Foto: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure KameraStartClick(Sender: TObject); 
    procedure KameraStopClick(Sender: TObject); 
    procedure VideoPanel1Resize(Sender: TObject); 
  private 
    { Private-Deklarationen } 
    procedure ChangeDriver(Sender: tObject); 
  public 
    { Public-Deklarationen } 
    capHandle: THandle; 
  end

var 
  Form1: TForm1; 

implementation 

{$R *.dfm} 

var 
  FileCounter : Word = 0
  Path : String = ''
  capDriverNum: Integer; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
  szDeviceName: array [0..80of AnsiChar; 
  szDeviceVersion: array [0..80of AnsiChar; 
  wIndex: Integer; 
  m: tMenuItem; 
begin 
  capDriverNum:= -1
  for wIndex := 0 to 9 do 
  begin 
    if (capGetDriverDescription (wIndex, szDeviceName, 
        sizeof (szDeviceName), szDeviceVersion, 
        sizeof (szDeviceVersion))) then 
    begin 
      inc(capDriverNum); 
      m := tMenuItem.Create(Form1.KameraTreiber1); 
      m.Caption := szDeviceName+' - ('+szDeviceVersion+')'
      m.Tag := wIndex; 
      m.OnClick := Form1.ChangeDriver; 
      if capDriverNum = 0 then m.Checked := True;  // Check first Item 
      m.RadioItem := True; 
      Form1.KameraTreiber1.Add(m); 
    end
  end

  if capDriverNum <= -1 then 
  begin 
    m := tMenuItem.Create(Form1.KameraTreiber1); 
    m.Caption := 'Kein Treiber gefunden'
    // m.OnClick := Call Messagebox... 
    m.RadioItem := True; 
    m.Checked := True; 
    Form1.KameraTreiber1.Add(m); 
  end else 
    capDriverNum := 0;  // Select first Driver 

  Form1.DoubleBuffered := True; 
end

procedure TForm1.ChangeDriver(Sender: TObject); 
var 
  DriverName: String
  Idx: Integer; 
begin 
  if Sender is TMenuItem then 
  begin 
    DriverName := (Sender as TMenuItem).Caption; 
    idx := (Sender as TMenuItem).Tag; 
    (Sender as TMenuItem).Checked := True; 
    // messagebox(handle,PAnsiChar(DriverName +#9+IntToStr(idx)),'#',0); 
    if idx <> capDriverNum then 
    begin 
      KameraStop.Click;  // Close old 
    end
  end
end

procedure TForm1.KameraStartClick(Sender: TObject); 
begin 
  if capDriverNum <= -1 then 
  begin 
    Application.MessageBox('Kein Capture-Treiber gefunden'
      'Sorry', MB_ICONSTOP + MB_OK); 
    Exit; 
  end

  // Init & Open Video Device 
  StatusBar1.SimpleText := 'Open Video Device... (' + 
    Format('%d x %d', [VideoPanel1.Width, VideoPanel1.Height]) + ')'

  capHandle := capCreateCaptureWindow(PAnsiChar('CapVideo'), WS_CHILD or WS_VISIBLE, 
    Form1.VideoPanel1.Left, Form1.VideoPanel1.Top, Form1.VideoPanel1.Width, 
    Form1.VideoPanel1.Height, Form1.VideoPanel1.Handle, 0); 


  // If capHandle = nil then ... Fehler beim Init? 

  // Init the first Capture Driver 0 
  capDriverConnect(capHandle, capDriverNum); // SendMessage(capHandle, WM_CAP_DRIVER_CONNECT, 0, 
  // Set Preview Rate 50 msec. 
  capPreviewRate(capHandle,50);  // SendMessage(capHandle, WM_CAP_SET_PREVIEWRATE, 20, 0); 
  capOverlay(capHandle, True);  // SendMessage(capHandle, WM_CAP_SET_OVERLAY, 1, 0); 
  capPreview(capHandle, True);  // SendMessage(capHandle, WM_CAP_SET_PREVIEW, 1, 0); 
end

procedure TForm1.KameraStopClick(Sender: TObject); 
begin 
  if capDriverNum <= -1 then Exit; 

  // Close Video Device 
  StatusBar1.SimpleText := 'Close Video Device...'

  capCaptureStop(capHandle); 
  capDriverDisconnect(CapHandle); 
end

procedure TForm1.VideoPanel1Resize(Sender: TObject); 
begin 
  VideoPanel1.Caption := Format('Video Capture Panel ( %d x %d )'
    [VideoPanel1.Width, VideoPanel1.Height]); 
end

end.




Wäre super nett wenn Ihr mir bei meinem Problem helfen könntet! Ich hock hier seit drei Tagen vor dem Proggi und komme nicht weiter.

Grüße

Marco
ma_sch
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 07.02.09 18:03 
Titel: Ist XpManifest das Problem?
Hallo nochmal,

ich habe herausgefunden dass das Problem auftritt, sobald ich die TXPManifest au die Form ziehe.

Bewirkt diese Unit im Hintergrund vielleicht noch andere Dinge als die Oberfläche in den XP-Stil zu verwandeln?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 07.02.09 18:20 
Die Unit bewirkt die Benutzung der neuen Common Controls. Dafür steht in der Unit XPMan nicht viel mehr als die Einbindung der entsprechenden Ressource mit dem Manifest. :-)

Video for Windows ist allerdings mittlerweile 17 Jahre oder so alt und heute eigentlich nicht mehr das Mittel der Wahl. Mit DSPack ging das meiner Erinnerung nach auch mit XPStyle, aber das kann ich nochmal ausprobieren.
ma_sch
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 07.02.09 18:50 
Das wäre super nett von Dir! ;)

Gibt es von dem DSPack auch eine (eigene) Version die unter Delphi 2009 läuft?
Hab da von Installationsschwierigkeiten gehört?!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 07.02.09 18:57 
Die Originalversion ja, aber wie ich in einem anderen Thread geschrieben habe:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe es mal ausprobiert, da waren beim neuesten RAD Studio (2009) einige Fehlermeldungen im DX9 Package in der Version bei Sourceforge, das stimmt. Es gibt aber im Internet leicht zu finden eine kompatible Version auch für Delphi 2009:
www.songbeamer.com/delphi/
ma_sch
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 07.02.09 19:57 
hmm...leider bin ich nicht von den Problemen verschont geblieben.

Habe mir das DSPack2009 von songbeamer.com runtergeladen.
Leider bekomme ich die Installation nicht auf die Reihe.

Da kommen Fehler wie [DCC Fataler Fehler] DirectX9_D12.dpk(41): F1026 Datei nicht gefunden: 'Direct3D9.dcu' , obwohl die "Direct3D9.pas" im selben Pfad vorhanden ist.
Das selbe mit der "DSPack.dcu" und der "MediaTypeEditor.dcu".
Ich habe auch schon nach Ratschlägen gesucht und sämtliche ausprobiert, u.a. versucht die JEDI.inc umzuschreiben, leider alles ohne Erfolg. :(
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 07.02.09 19:59 
Die angegebenen Pfade hast du aber in den Bibliothekspfad hinzugefügt?
Anleitung hat folgendes geschrieben:
Add this paths to your search directory:
- (DSPackDir)\src\Directx9
- (DSPackDir)\src\DSPack
ma_sch
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 07.02.09 20:20 
Ich hab den Pfad in der DirectX9_D12, DSPack_D12 und der DSPackDesign jedesmal explizit dabei geschrieben, dürfte das selbe sein als wenn ich die Suchpfade hinzufüge, global wollte er es irgendwie nicht machen. Auf jeden Fall hat er die .pas s jetzt gefunden und die .dcu s erstellt. Trotzdem kommt er nicht weiter, es folgt: "Ohne Angabe einer Host-Anwendung kann das Projekt nicht ausgeführt werden. Verwenden Sie das Dialogfeld Start|Parameter...".
Leider ist keine .exe als Host-Anwendung im DSPack vorhanden?!


Zuletzt bearbeitet von ma_sch am Sa 07.02.09 20:22, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 07.02.09 20:21 
Du kannst das Package auch nicht ausführen, die Packages müssen nur installiert werden, danach sollten die Komponenten in der Komponentenpalette vorhanden sein. Die kannst du dann in einem Projekt aufs Formular legen.
ma_sch
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 07.02.09 20:24 
Ich finde aber doch auch keine .bpl s, die ich über Komponente|Packages installieren verwenden könnte?
ma_sch
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 07.02.09 21:06 
Überflüssige Frage ich weiß. ;)

Beim installieren bleibt noch ein Fehler übrig, weshalb die Units nicht kompiliert werden können.

[DCC Fehler] D3DX8.pas(4899): E2250 Es gibt keine überladene Version von 'D3DXGetErrorString', die man mit diesen Argumenten aufrufen kann

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
       function D3DXGetErrorStringA(hr: HResult): AnsiString;
       var
         Buffer: array [0..254of AnsiChar;
       begin
(4899)   D3DXGetErrorString(hr, PAnsiChar(@Buffer), 255);
         SetLength(Result, StrLen(PAnsiChar(@Buffer)));
         Move(Buffer, Result[1], Length(Result));
       end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 07.02.09 21:23 
Das dürfte an dem Cast auf PAnsiChar vor der Übergabe an D3DXGetErrorString liegen. Ich vermute, dass es geht, wenn du das in PChar änderst.
ma_sch
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.02.09 12:15 
Mit DSPack funktioniert es in Delphi 2009.

Vielen Dank für Eure Hilfe!

Thread kann geschlossen werden.