Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DirectShow vs VFW (https://www.delphipraxis.net/69283-directshow-vs-vfw.html)

Aya 12. Mai 2006 21:59


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~

skyobserver 19. Mai 2006 12:15

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: Download-Link zu Microsoft GraphEdit

-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...

Aya 19. Mai 2006 16:44

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~

skyobserver 19. Mai 2006 23:02

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.

Weblink zu Microsoft MSDN: Grabbing a Poster Frame

Diese Funktion liefert Bitmaps ausschließlich im 24-Bit Format.

Aya 20. Mai 2006 15:05

Re: DirectShow vs VFW
 
Hi,

ok danke :)
Werd mir das ganze dann mal die tage genauer anschauen.

Aya~

Aya 22. Mai 2006 18:45

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:
Weblink zu Microsoft MSDN: Grabbing a Poster Frame

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~

skyobserver 27. Mai 2006 19:36

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.

Aya 27. Mai 2006 19:39

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~

skyobserver 27. Mai 2006 19:54

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?

Aya 27. Mai 2006 20:02

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~

skyobserver 27. Mai 2006 20:19

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:

VideoFrameStep

Aya 27. Mai 2006 20:22

Re: DirectShow vs VFW
 
Hi,

das mit dem VideoFrameStep ding klingt schonmal ganz ok, werd ich mal ausprobieren :)

Aya~

skyobserver 27. Mai 2006 20:27

Re: DirectShow vs VFW
 
Doch noch gefunden:

Controlling a Capture Graph

Aya 29. Mai 2006 22:16

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~

skyobserver 30. Mai 2006 20:01

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