![]() |
DirectShow vs VFW
Hi,
ich benutze z.Z. VFW (Video for Windows) um AVI Dateien abzuspielen... bin aber am überlegen auf DirectShow umzusteigen. Nur, ich hab KA ob das was ich vorhabe damit geht und ob es wirklich sinnvoll ist. Also: a) Ich möchte das Video nicht einfach auf einem Panel o.Ä. ausgeben sondern brauche jedes Frame einzeln als z.B. TBitmap.. mit vfw geht das wunderbar.. geht das mit DS auch?? b) Kann DS auch wmv etc abspielen?? Denn vfw kann leider nur AVIs... :( Kann DirectShow die beiden dinge?? Aya~ |
Re: DirectShow vs VFW
Hallo Aya,
da ich mich gerade selber durch die MSDN-Doku zu DirectShow quäle, kann ich Dir sagen, daß Du damit jede Audio- bzw. Video-Datei abspielen kannst für die es die entsprechenden Codecs auf Deinem Rechner gibt. DS ist beim Einsteigen ziemlich verwirrend (zumindest wenn man keine Ahnung von COM hat). Einen Vorgeschmack bekommt man am besten wenn man sich mit dem Tool GraphEdit von Microsoft beschäftigt. Laut Microsoft soll es im DirectX-SDK enthalten sein, was aber nicht der Fall ist. Man findet es auch bei Microsoft im Web nicht. Guggst Du hier: ![]() -Erstmal entpacken... -GraphEdit.exe starten -File -> Render Media File... aus dem Menü auswählen -Beliebige Mulimedia-Datei auswählen (DivX, MP3,...) -Start-Button drücken Das ganze Tool ist nichts weiter als eine grafische Oberfläche zu den DirectShow-Funktionen! Das sollte für den Anfang reichen... |
Re: DirectShow vs VFW
Hi,
mhh.. ja ist schonmal hilfreich :) Aber bevor ich mich da jetzt reinknie... geht es denn das ich einzelne Frames von Videos in irgendeinem format bekomme?? Bzw kenne ich DShow nur so bisher das man nen FensterHandle angibt in dem das Video dargestellt wird, aber das will ich ja nicht... ich will es einfach als RGB-Array oder TBitmap oder sonstwas.. geht das?? Aya~ |
Re: DirectShow vs VFW
JA!
Um ein AVI-File in einzelnen Frames zu laden ist es am einfachsten den Media Detector von DirectShow zu verwenden. Der erledigt viele lästige Vorarbeiten um die man sich sonst kümmern müßte intern von selbst. ![]() Diese Funktion liefert Bitmaps ausschließlich im 24-Bit Format. |
Re: DirectShow vs VFW
Hi,
ok danke :) Werd mir das ganze dann mal die tage genauer anschauen. Aya~ |
Re: DirectShow vs VFW
Hi,
hab mir das ganze jetzt angeschaut und funktioniert auch soweit sehr gut, nur... das ganze ist bei mir viel langsamer als vfw.. Ich Öffne das ganze wie hier beschrieben: ![]() und benutze dann dashier: pDet->GetBitmapBits(cFrame, nil, pBuffer, width, height); um das aktuelle Frame in den Buffer zu bekommen... aber er schafft es nicht das video flüssig abzuspielen.. ne idee wieso? :( Aya~ |
Re: DirectShow vs VFW
Die Funktion "Grabbing a Poster Frame" ist wohl eher dafür
gedacht gezielt einzelne Bilder aus einer Videodatei zu laden. Warscheinlich wird dabei jedesmal die Position in der Datei neu ermittelt, anstatt einfach nur die Folgeposition zu laden. Wenn es Dir nicht um die (aufwendige) Bearbeitung der einzelnen Bilder geht wobei die Ladezeit zu vernachlässigen wäre, sonder mehr um das flüssige abspielen, ist es natürlich schneller die Bilder es aus einem laufendem Stream abzugreifen. Dafür würde ich dann den SampleGrabber benutzen. Der ist zwar nicht so einfach zu verwenden, aber man kann die Einzelbilder im VideoStream abgreifen oder verändern bevor sie weiter durch die Filterkette laufen. Hinter den SampleGrabber schaltet man einen Standard Render-Filter zur Ausgabe der geänderten Bilder oder einen NullRenderer-Filter wenn man die Bilder nicht anzeigen lassen möchte. |
Re: DirectShow vs VFW
Hi,
ich hab das mit dem SampleGrabber schon probiert.. klappt auch soweit, aber... ich hab bei dem ding nur die möglichkeit gefunden Play zu drücken und dann die daten abzufangen... Ich bräuchte mehr sowas wie getNextFrame().. also das der Stream pausiert ist und ich immer dann wann ich will das nächste frame bekomme :) Geht das irgendwie?? Habe ich bisher keine möglichkeit für gefunden leider :( Aya~ |
Re: DirectShow vs VFW
Wenn Du ein Video flüssig abspielen möchtest muß die Bearbeitung eines
Bildes bei z.B. 25fps natürlich in weniger als einer 1/25 abgeschlossen sein - sonst ist es halt nicht mehr flüssig. Wozu brauchst Du unbedingt eine GetNextFrame Funktion? |
Re: DirectShow vs VFW
Hi,
brauche das weil ich z.B. die Framerate selber bestimmen möchte.. also z.B. meinetwegen auch nur 10fps o.Ä. Und ich brauche es um selber zu bestimmen wann welches frame kommt, um synchonität zwischen zwei videos hinzubekommen :) Aya~ |
Re: DirectShow vs VFW
Es gibt wohl die Möglichkeit mit MediaFilter.SetSyncSource den
Takt den deine Videoquelle durch die fps vorgibt zu überschreiben: Ich verwende das z.B. um den Takt abzuschalten, damit die Bilder so schnell wie möglich und ohne Verzögerung kommen (Takt = 0). Eine richtige Kontrolle gibt Dir das aber nicht... Ich habe irgendwo in der MSDN gelesen, daß man den VideoStream im Filtergraph vor und nach einem Filter getrennt Steuern kann. Dann kann man dem Ausgangs-Pin des Filters sagen, daß er den nächsten Pin benachrichtig das er seinen nächsten Frame abholen kann. Ich konnte das Thema jetzt auf die schnelle zwar nicht finden habe aber dabei das hier gefunden: ![]() |
Re: DirectShow vs VFW
Hi,
das mit dem VideoFrameStep ding klingt schonmal ganz ok, werd ich mal ausprobieren :) Aya~ |
Re: DirectShow vs VFW
|
Re: DirectShow vs VFW
Hi,
hab das IVideoFrameStep jetzt ausprobiert... aber bekomm es nicht hin.. also Fehlermeldungen sind keine da, aber wenn ich dann Step(1, nil) aufrufe tut sich halt garnix.. meine SampleGrabberCB-Funktion wird nicht aufgerufen etc.. bekomme kein neues frame. Rückgabewert von Step() etc ist aber S_OK... ne idee?? Au'revoir, Aya~ |
Re: DirectShow vs VFW
...leider nein...hab' ich selbst noch nicht benutzt.
Habe die letzten drei Tage damit verbracht herauszubekommen wie man vom Programm aus die Auflösungen einer Webcam ermittelt und umstellt... Hattest Du den Link "Controlling a Capture Graph" (siehe oben) schon mal angesehen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 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