AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi mciSendStr('capture/copy video...') wird nicht unterstützt
Thema durchsuchen
Ansicht
Themen-Optionen

mciSendStr('capture/copy video...') wird nicht unterstützt

Ein Thema von Christian Seehase · begonnen am 28. Jun 2003 · letzter Beitrag vom 31. Dez 2006
Antwort Antwort
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#1

mciSendStr('capture/copy video...') wird nicht unterstützt

  Alt 28. Jun 2003, 00:51
Moin Zusammen,

was mache ich hier falsch:

Delphi-Quellcode:
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;
Die Funktion mciSendString('capture video ...) kommt mit einem

"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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#2
  Alt 28. Jun 2003, 13:02
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
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 28. Jun 2003, 14:08
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 1. Jul 2003, 14:51
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 www.progdigy.com heruntergeladen, dass, hauptsächlich, ein Wrapper für DirectShow ist. Leider lässt sich diese Version nur mit DirectX 9 verwenden. Dessen Installation ist also auch notwendig.
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:
  1. TFilterGraph
    Die Standardeinstellungen können beibehalten werden
    Die Ereignisse OnActivate und OnGraphPaused habe ich hier verwendet
  2. TSampleGrabber
    Die Eigenschaft FilterGraph muss gesetzt werden
    Die Eigenschaft MediaType wird wie folgt gesetzt:
    Major Type Video, Sub Type RGB24 und Format Type VideoInfo
  3. TFilter
    Die Eigenschaft FilterGraph muss gesetzt werden.
    Als BaseFilter habe ich unter Selector\Filters\DirectShow Filters\SampleGrabber ausgewählt
    (nicht wundern, wenn auf den [...] Button bei BaseFilter erst mal nichts passiert. Die Kompo sucht erst einmal die auf dem Rechner befindlichen Filter zusammen, und das kann dauern )
  4. TVideoWindow
    Die Eigenschaft FilterGraph muss gesetzt werden.

Und so sieht dann der Code aus:

Delphi-Quellcode:
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;
Was vielleicht noch interessant ist:
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#5

Re: mciSendStr('capture/copy video...') wird nicht unterstüt

  Alt 31. Dez 2006, 11:35
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:
Ein Objekt oder ein Name wurde nicht gefunden. ($80040216).
Gruß
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: mciSendStr('capture/copy video...') wird nicht unterstüt

  Alt 31. Dez 2006, 13:54
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#7

Re: mciSendStr('capture/copy video...') wird nicht unterstüt

  Alt 31. Dez 2006, 14:33
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.)
  • Nun stehe ich allerdings vor den von dir genannten Problemen:
  • MPEG Video Decoder
    Keine Fehlermeldung, Bilder allerdings schwarz.
  • Divx-Avi
    Interessant hierbei, er zeigt mir im VideoWindow ein Bild an. Zusätzlich kommt diese Fehlermeldung.
    Zitat:
    Zugriffsverletzung bei Adresse 66BA6697 in Modul 'qedit.dll'. Schreiben von Adresse 0365F000.
  • Wmv funktioniert, allerdings kein Spulen möglich
  • asf ohne Probleme

Ich habe hier ein Beispiel gefunden den VCL-Player per ActivX einzubinden. Mal sehen ob ich es damit umsetzen kann. Diese Option wollte ich eigentlich nur als zusätzliches Feature einbauen um auch auf Formate zuzugreifen, bei denen der MediaPlayer streikt, da eich einem Anwender nicht zumuten wollte zwangsweise Drittsoftwre zu installieren (auch wenn sie Freeware/Opensource ist).
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
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: mciSendStr('capture/copy video...') wird nicht unterstüt

  Alt 31. Dez 2006, 14:52
Moin Christian,

welche Version der qedit.dll hast Du denn?
Meine ist 6.05.2600.2180
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#9

Re: mciSendStr('capture/copy video...') wird nicht unterstüt

  Alt 31. Dez 2006, 15:22
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.
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:40 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