![]() |
mciSendStr('capture/copy video...') wird nicht unterstützt
Moin Zusammen,
was mache ich hier falsch:
Delphi-Quellcode:
Die Funktion mciSendString('capture video ...) kommt mit einem
procedure TfrmMAIN.Button2Click(Sender: TObject);
var mciErr : DWORD; pBuf : PChar; dwLen : DWORD; begin dwLen := 250; pBuf := AllocMem(dwLen); try mciErr := mciSendString(PChar('open mpegvideo!c:\test.mpg alias video parent '+IntToStr(self.Handle)),nil,0,self.Handle); if mciErr <> 0 then exit; mciErr := mciSendString('put video destination at 0 0 170 156',nil,0,self.Handle); if mciErr <> 0 then exit; mciErr := mciSendString(PChar('window video handle '+IntToStr(self.Handle)),nil,0,self.Handle); if mciErr <> 0 then exit; // mciErr := mciSendString('play video',nil,0,self.Handle); // if mciErr <> 0 then exit; mciErr := mciSendString('capture video as c:\test.bmp',nil,0,self.Handle); finally if mciErr <> 0 then begin mciGetErrorString(mciErr,pBuf,dwLen); ShowMessage(trim(pBuf)); end; FreeMem(pBuf,250); end; end; "Das verwendetet MCI-Gerät unterstützt diesen Befehl nicht" zurück. Gleiches gilt für copy und save. Sollte ja im Prinzip an Deutlichkeit nicht zu überbieten sein, wenn da nicht noch zwei Dinge wären: Zum einen ist die Unterstützung für diese Kommandos dokumentiert (muss zugegebener Massen ja nichts heissen), zum anderen funktioniert aber in einem mit MCICreateWnd erzeugten mci Fenster die Tastenkombination Strg-C zum Kompieren. Was mach' ich also falsch, übersehe ich, oder hab' ich vergessen? |
Hallo Christian Seehase,
habe mal das ganze selber probiert und leider auch keine Möglichkeit gefunden. Es scheint tatsächlich so zu sein, daß dieser Befehl bei einem Video nicht unterstützt wird. Schade das ich Dir dabei nicht helfen kann. bye |
Moin Duffy,
danke für Deine Info. Leider kann man capture und copy nicht über capability abfragen. Save geht, und wird nicht unterstützt. Ich frage mich nur, auf welchem Wege dann bei einem MCI Fenster STRG-C funktioniert, wenn denn copy nicht unterstützt wird. Was ich oben noch vergessen hatte: Probiert habe ich das mit MPG und AVI, mit jeweils gleichem Ergebnis. Ausserdem habe ich inzwischen den device type abgefragt, und es wird digitalvideo zurückgegeben, also noch nicht mal overlay, und trotzdem funktioniert auch ein Screenshot nicht :shock: |
Moin Zusammen,
Problem erkannt, und mittels Workaround gelöst ;-) Wenn man über MCICreateWnd ein Mediaplayerfenster erzeugt, gibt es ja auch einen Menüpunkt der es einem gestattet Kommandos zu verschicken, so wie man es programmseitig mittels mciSendString machen kann. Auch über diesen Weg gab' es nun die Rückmeldung, dass die Kommandos nicht unterstützt werden. Scheint also doch kein Anwendungsfehler von mir zu sein, sondern tatsächlich nicht so zu gehen :? Auf welchem Wege nun das Kopieren aus dem Menü heraus intern funktioniert hab' ich allerdings nicht herausbekommen können. Falls ich nicht der einzige bin, der so etwas vorhat möchte ich allerdings mal kurz den Workaround vorstellen, den ich dazu gefunden habe. Ich habe mir das DSPack (Version 2.31 vom 01.06.2003) von ![]() Wichtig noch für alle die DelphiX verwenden. Aufgrund von Namensgleichheit bei Units ist davon auszugehen, dass dies nach der Installation des DSPack nicht mehr funktioniert. Ich habe nicht versucht beides parallel lauffähig zu bekommen, obwohl es wohl machbar sein sollte. Die für meinen Workaround erforderlichen Interfaces wären IFilter, IFilterGraph, ISampleGrabber, IMediaSeeking und IVideoWindow, falls es jemand mal ohne Komponenten ausprobieren möchte (erstmal werde ich mir das ersparen ;-)) Als Komponenten aus dem DSPack werden benötigt:
Und so sieht dann der Code aus:
Delphi-Quellcode:
Was vielleicht noch interessant ist:
procedure Delay(const AdwMilliSec : DWORD);
var dwStart : DWORD; begin dwStart := GetTickCount; while (GetTickCount-dwStart) < AdwMilliSec do Application.ProcessMessages; end; // an beliebiger Stelle, z.B. auf Button Click, den FilterGraph aktivieren FilterGraph1.Active := true; // OnActivate des FilterGraph FilterGraph1.RenderFile('<Pfad der betreffenden Datei>'); FilterGraph1.Pause; // OnGraphPaused // (in diesem Beispiel werden das erste und das letzte Bild der Datei als Bitmap gespeichert) var bmpWork : TBitmap; ms : IMediaSeeking; i64Current : int64; i64Stop : int64; begin bmpWork := TBitmap.Create; try // Anfangsbild speichern SampleGrabber1.GetBitmap(bmpWork); bmpWork.SaveToFile('c:\testbmpA.bmp'); finally FreeAndNil(bmpWork); end; // IMediaSeeking abfragen, um die Position verstellen zu können FilterGraph1.QueryInterface(IMediaSeeking,ms); // aktuelle Position und Endposition in der Datei auslesen ms.GetPositions(i64Current,i64Stop); // aktuelle Position auf Endposition setzen ms.SetPositions(i64Stop,AM_SEEKING_AbsolutePositioning,i64Stop,AM_SEEKING_AbsolutePositioning); // Ein wenig auf das Positionieren warten Delay(500); bmpWork := TBitmap.Create; try SampleGrabber1.GetBitmap(bmpWork); bmpWork.SaveToFile('c:\testbmpE.bmp'); finally FreeAndNil(bmpWork); end; end; Ohne das VideoWindow funktioniert es nicht, aber die Grösse des VideoWindow spielt keine Rolle, da die herauskopierten Frames immer in ihrer jeweiligen 100% Grösse (Abmessung) gespeichert werden. |
Re: mciSendStr('capture/copy video...') wird nicht unterstüt
Moin Christian,
deine Lösung funktioniert bei mir leider nicht, egal bei welchem Video ich es Versuche (wmv, avi, mpg), ich bekomme immer eine Fehlermeldung: Zitat:
|
Re: mciSendStr('capture/copy video...') wird nicht unterstüt
Moin Christian,
seltsam. Ich habe mir das DSPACK (2.3.4) mal für D2006 angepasst und installiert. (Anzupassende Dateien DirectX9_D10.dpk,DSPack_D10.dpk,DSPackDesign_D10.d pk,Jedi.inc,BaseClass.pas,DSPack.pas,DSEditors.pas ) Die Anpassungen sind allerdings minimal. Da ich unter D2005 mal Probleme hatte, wenn die dpk-Dateien auf D7 endeten, habe ich sie auf D10 umbenannt, ausserdem habe ich in diesen Dateien alle Pfade vor den enthaltenen Dateien entfernt, da ich sie (samt der DPK-Dateien), in das gleiche Verzeichnis schreibe. In der JEDI.INC habe ich nur die Defines bis D2006 ergänzt (VER160,VER170,VER180), was aber wohl nicht zwingend erforderlich ist. Um Hints vom Compiler vermeiden, habe ich dann noch (BaseClass.pas, DSPack.pas) die Schreibweise von ein paar Methoden geändert, die mir der Compiler "angemeckert" hat. Auch das dürfte allerdings nicht zwingend erforderlich sein. In der DSEditors.pas habe ich dann noch, die Verwendung von DesingIntF und DesignEditors für VER160, VER170 und VER180 eingebaut. Zum Installieren, habe ich in den Optionen die Pfade für meine Installation (in LIB\DSPACK) eingetragen, die DirectX9_D10.dpk geladen und compiliert, die DSPACK_D10.dpk geladen und compiliert, und dann die DSPackDesign_D10.dpk geladen und installiert. Anschliessend habe ich dann meinem o.g. Beispiel folgend ein neues Projekt erstellt. BTW: die DirectShow9 muss noch in die Uses, das fehlt da oben. Getestet habe ich es mit WMV (funktioniert soweit, nur das "Weiterspulen" auf das letzte Bild hat nicht richtig geklappt), MPEG2 (da fehlt mir eine Filterverbindung, ich weiss jetzt aber nicht welche :?), DivX-AVI (da bekomme ich leere Bitmaps, 0 KB), MPEG1 (funktioniert) Wo es nicht funktioniert einwandfrei funktioniert hat, liegen aber wohl eher Einstellungs- und Timingprobleme vor. Nur den von Dir genannten Fehler konnte ich nicht reproduzieren. :gruebel: |
Re: mciSendStr('capture/copy video...') wird nicht unterstüt
Moin,
ich habe das Problem gelöst, es gab ein kleines Problem mit dem Pfad. (Eine Fehlermeldung "Datei nicht gefunden" hätte mich schneller auf die Lösung gebracht.)
Ich habe ![]() Aber wenn es anders nich umsetzbar ist, so bleibt mir wohl nichts anderes übrig. Ich muss allerdings sagen, ich bin schon noch etwas verwundert, warum man mit dem TMediaplayer nicht das aktuelle Bild in den Speicher zeichnen lassen kann. Gruß und besten Dank |
Re: mciSendStr('capture/copy video...') wird nicht unterstüt
Moin Christian,
welche Version der qedit.dll hast Du denn? Meine ist 6.05.2600.2180 |
Re: mciSendStr('capture/copy video...') wird nicht unterstüt
Ich habe ebenfalls die Version 6.05.2600.2180. Ich vermute derzeit, dass es eventuell an meinem Divx-Treiber liegen könnte. (Im Tray sehe ich das er anspringt)
Ich verwende derzeit: K-Lite Codec Pack 2.78 Full Eventuell "blockiert" er ja in irgendeinerweise den Zugriff. [Add] Mit dem VLC-Player scheine ich auch kein Glück zu haben, allem anschein nach kann man ihn "nur" als Player einsetzen und ihn dann steuern, an einzelnde Bilder kommt man mit ihm auch nicht drann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:02 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