Entwickler-Ecke
Multimedia / Grafik - Format für Auflösung in AVICap einstellen
SmileySN - So 17.07.11 16:22
Titel: Format für Auflösung in AVICap einstellen
Ich zeige ein Bild von einem VideGrabber an und möchte die Standard Einstellung des VideoFormates in Pixel voreinstellen.
Eingestellt ist immer das Format 640x480 Pixel mein Grabber hat aber 720*576 Pixel.
Mit dem Aufruf von capdlgVFormat kann ich die Auflösung umstellen und alles funktioniert wunderbar.
Da ich jedoch nur die Auflösung 720*576 Pixel benötigem, möchte ich diese voreistellen.
Dazu müsste ich doch den Befehl:
function capSetVideoFormat(hwnd:THandle; s:LongInt; wSize:Word):LongInt;
benutzen können, hoffe ich.
Leider finde ich keine Erklärung der Parameter die mir sagen was sie bedeuten und was ich dort eintragen muss.
Was kann ich mit s und wSize anfangen und was gibt die Function zurück ?
Möglich, dass s ein Index auf eine Liste ist.
Dazu müsste ich dann die Liste der möglichen Auflösungen einlesen und dann daraus meine Auflösung auswählen und setzen.
Kennt sich damit jemand aus und kann mir das an einem Beispiel erklären ?
Vielen Dank
Tilo - So 17.07.11 18:17
Hallo,
Ich habe selber schonmal mit der WinAPI gearbeitet.
Der Befehl "function capSetVideoFormat(hwnd:THandle; s:LongInt; wSize:Word):LongInt; "
bassiert vermutlich auf der Windowsnachricht "WM_CAP_SET_VIDEOFORMAT Message" (siehe
http://msdn.microsoft.com/en-us/library/dd757737%28v=VS.85%29.aspx)
Zu den Parametern:
hwnd:THandle -> Das Videofenster
s:LongInt -> Pointer auf eine Variable vom Typ BITMAPINFO (siehe MSDN Doku)
wSize:Word -> Die Größe Variable auf sie der Parameter s zeigt.
Die Auflösung steht dann in der BITMAPINFO Variablen.
Ich hoffe ich liege damit nun richtig.
Kannst Du eventuell den Quelltext zu der von dir verwendeten FUnktion "capSetVideoFormat" posten?
MFG
Tilo
SmileySN - So 17.07.11 18:56
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function capGetVideoFormat(hwnd:THandle; s:LongInt; wSize:Word):LongInt; begin Result := SendMessage(hwnd, WM_CAP_GET_VIDEOFORMAT, wSize, s); end;
function capGetVideoFormatSize(hwnd:THandle):LongInt; begin Result := SendMessage(hwnd, WM_CAP_GET_VIDEOFORMAT, 0, 0); end;
function capSetVideoFormat(hwnd:THandle; s:LongInt; wSize:Word):LongInt; begin Result := SendMessage(hwnd, WM_CAP_SET_VIDEOFORMAT, wSize, s); end; |
Das ist aus der Datei AVICap.pas
Mal sehen ob ich den BitmapInfoHeader in irgendeiner Pascal Routine finde, dann muss ich ihn mir nicht neu erstellen.
Der müsste in den AVICap Dateien ja irgendwo definiert sein.
Dann muss ich wohl erst mal das VideoFormat lesen und dann die Werte im BitMapInfoHeader ändern und wieder wegschreiben.
Sobald ich es hinbekommen habe melde ich mich wieder.
Wenn es jemand aus einem vorhandenen Projekt heraus kopieren kann darf er das natürlich auch gerne tun.
SmileySN - So 17.07.11 22:23
Ich habe etwas gefunden und entsprechend umgebaut, komme aber mit einem Übergabeparameter nicht hin.
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:
| Procedure TForm1.SetVideoFormat; Var vfs: Word; lpBmpInfo: BITMAPINFO; Begin vfs := sizeof(BITMAPINFO); capGetVideoFormat(PanelVideo2.Handle, lpBmpInfo, vfs); <--- Hier Fehler beim zweiten Parameter lpBmpInfo lpBmpInfo.bmiHeader.biWidth := 720; lpBmpInfo.bmiHeader.biHeight := 576; lpBmpInfo.bmiHeader.biBitCount := 8; lpBmpInfo.bmiHeader.biPlanes := 1; lpBmpInfo.bmiHeader.biClrUsed := 0; lpBmpInfo.bmiHeader.biXPelsPerMeter := 0; lpBmpInfo.bmiHeader.biSize := 40; lpBmpInfo.bmiHeader.biYPelsPerMeter := 0; lpBmpInfo.bmiHeader.biCompression := BI_RGB; lpBmpInfo.bmiHeader.biClrImportant := 0; lpBmpInfo.bmiHeader.biSizeImage := lpBmpInfo.bmiHeader.biWidth * lpBmpInfo.bmiHeader.biHeight * lpBmpInfo.bmiHeader.biBitCount / 8;
capSetVideoFormat(PanelVideo2.Handle, lpBmpInfo, vfs); End; |
Die Routine capGetVideoFormat will einen Integer Parameter haben, ich muss ihr aber dort die BmpInfo übergeben, möglicherweise als Offset oder Adresse ???
Regan - So 17.07.11 23:01
Muss dort nicht der Pointer hin?
SmileySN - So 17.07.11 23:07
Ja das ist richtig er erwartet die Adresse der BitmapInfo Structur
Wenn ich @lpBmpInfo schreibe nimmt er das aber auch nicht, da er einen Integer erwartet.
Wenn ich nur lpBmpInfo rein schreibe sollte ja die Variable by reference übergeben werden, was er ja eigentlich auch will, da es aber als Integer definiert ist nimmt er keinen Pointer.
jaenicke - So 17.07.11 23:17
Du musst auf LongInt casten. ;-)
SmileySN - So 17.07.11 23:29
Delphi-Quelltext
1:
| capGetVideoFormat(PanelVideo2.Handle, lpBmpInfo AS LongInt, vfs); |
So funktioniert es auch nicht,
[DCC Fehler] Main.pas(615): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
auch nicht mit "@lpBmpInfo As LongInt"
[DCC Fehler] Main.pas(615): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
glotzer - So 17.07.11 23:31
capGetVideoFormat(PanelVideo2.Handle, LongInt(@lpBmpInfo), vfs);
SmileySN - So 17.07.11 23:35
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:
| Procedure TForm1.SetVideoFormat; Var vfs: Word; lpBmpInfo: BITMAPINFO; Begin vfs := sizeof(BITMAPINFO); capGetVideoFormat(PanelVideo2.Handle, LongInt(@lpBmpInfo), vfs); lpBmpInfo.bmiHeader.biWidth := 720; lpBmpInfo.bmiHeader.biHeight := 576; lpBmpInfo.bmiHeader.biBitCount := 8; lpBmpInfo.bmiHeader.biPlanes := 1; lpBmpInfo.bmiHeader.biClrUsed := 0; lpBmpInfo.bmiHeader.biXPelsPerMeter := 0; lpBmpInfo.bmiHeader.biSize := 40; lpBmpInfo.bmiHeader.biYPelsPerMeter := 0; lpBmpInfo.bmiHeader.biCompression := BI_RGB; lpBmpInfo.bmiHeader.biClrImportant := 0; lpBmpInfo.bmiHeader.biSizeImage := lpBmpInfo.bmiHeader.biWidth * lpBmpInfo.bmiHeader.biHeight * lpBmpInfo.bmiHeader.biBitCount div 8; capSetVideoFormat(PanelVideo2.Handle, LongInt(@lpBmpInfo), vfs); End; |
So lässt es sich jetzt schon mal Compilieren
jaenicke - So 17.07.11 23:46
Um das vielleicht noch einmal klarzumachen:
Der Operator as ist dafür gedacht, dass bei einem Objekt geprüft wird, ob der Zieltyp in dessen Vererbungshierarchie vorkommt. Zum Beispiel, wenn man bei einem Ereignis in Sender einen Button übergeben bekommt. Dann kann man den mit as auf TButton casten und dies wird fehlschlagen, wenn in Sender gar kein TButton drin liegt.
Da du hier einen einfachen Datentyp und keine Klasse als Zieltyp hast, musst du deshalb hart (ohne Prüfung) casten.
SmileySN - So 17.07.11 23:56
Danke nochmal Sebastian, du warst wie immer eine große Hilfe.
Dank auch an Glotzer für die Hilfe.
Das Programm funktioniert im Prinzip, stellt aber das Format nicht um, das muss ich dann morgen mal weiter verfolgen.
SmileySN - Mo 25.07.11 11:36
Ich komme leider noch nicht weiter, es kommen keine Werte zurück in Bitmapinfo.
Selbst wenn ich nur die größe von Bitmapinfo zur Übergabe feststellen möchte mit dem Befehl
Delphi-Quelltext
1:
| vfs:=longint(getvideoformatsize(PanelVideo2.Handle)); |
bekomme ich immer nur 0 zurückgeliefert,
obwohl der Treiber installiert ist und die Anzeige des Videos im PanelVideo2 auch funktioniert.
In einem Forum habe ich gelesen, dass man capgetvideoformat (sendmessage(WM_CAP_GET_VIDEOFORMAT,0,0) 2 mal aufrufen muss,
einmal mit 0 (um die Größe der Bitmapinfo-Variablen zu bekommen) und einmal mit dem Pointer der Bitmapinfo-Variablen um die Werte übergeben zu bekommen.
aber beriets der erste Aufruf mit (sendmessage(WM_CAP_GET_VIDEOFORMAT,0,0) liefert schon 0 zurück.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!