Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Prism Zeichnen auf Video? (https://www.delphipraxis.net/90062-zeichnen-auf-video.html)

Quetzalcoatl 11. Apr 2007 01:13


Zeichnen auf Video?
 
Hi,

Also ich hab grad mit Delphi angefangen und muss nun für mein Projekt auf einem Video zeichnen.
Das Video läuft über diese TMediaPlayer sache und wird in einem Panel angezeigt. Kann ich irgendwie auf diesem Video z.b. Kreise malen? Wenn das so nicht geht, weiß jemand eine Möglichkeit auf einem Video zu malen?

Vielen Dank für jede Hilfe und `nen schönen Gruß,
Quetzalcoatl

dino 11. Apr 2007 01:54

Re: Zeichnen auf Video?
 
Obwohl ich dir da nicht helfen kann schreibe ich trotzdem, weil ich die Herzlich in der DP Willkommen heissen will!

übersichtshalber hier die ausgangsfrage:


Zitat:

Zitat von Quetzalcoatl
Hi,

Also ich hab grad mit Delphi angefangen und muss nun für mein Projekt auf einem Video zeichnen.
Das Video läuft über diese TMediaPlayer sache und wird in einem Panel angezeigt. Kann ich irgendwie auf diesem Video z.b. Kreise malen? Wenn das so nicht geht, weiß jemand eine Möglichkeit auf einem Video zu malen?

Vielen Dank für jede Hilfe und `nen schönen Gruß,
Quetzalcoatl


Sunlight7 11. Apr 2007 03:54

Re: Zeichnen auf Video?
 
Moin!

MCI (der TMediaPlayer spricht MCI an) bietet Möglichkeiten, sich in den Draw-Händler einzuklinken, theoretisch müsste es also möglich sein, aber ich würde da direkt mit MCI Arbeiten, anstatt das mit dem TMediaPlayer zu versuchen.

Eine andere Möglichkeit wäre, es mit DirectShow zu machen.

Mavarik 11. Apr 2007 07:57

Re: Zeichnen auf Video?
 
Hallo!

Was nennst Du den Malen?

- Einmalig?
- Live/realtime?
- oder das Video ändern?

Frank :coder:

Quetzalcoatl 11. Apr 2007 12:27

Re: Zeichnen auf Video?
 
Mit malen meinte ich eine bestimmte Stelle markieren. Also was ich vor hab ist das man eine bestimmte Stelle anklickt, mehrmals an verschiedenen Stellen, dann wird ein Farbmittelwert gebildet und mit diesem soll der Punkt den man ausgewählt hat im video weiterverfolgt werden. Im Prinzip nicht weiter schwierig, bloß fehlt mir noch die Grundlage in Delphi, eben diese Stelle live im Video dann auch markieren zu können, z.b. mit einem Kreis.
Also wenn da wer was zu weiß, bitte melden ;)
Achja das mit MCI hab ich leider absolut nicht verstanden -.-

Quetzalcoatl

Quetzalcoatl 11. Apr 2007 15:32

Re: Zeichnen auf Video?
 
So, ich hab jetzt mal festgestellt das man auf ein Panel ja ganz einfach draufmalen kann über so ein Canvas.. also ich kann auf dasselbe Panel,auf dem nachher das video läuft auch draufmalen, nur wird das Video über den Kreis gemalt, sodass man den nich sieht.. kann man da irgendwie die reihenfolge umstellen, also das das Canvas zeugs überm Video liegt, und man dann den kreis auf das Video draufmalt? Weiß das wer? oder bin ich auf nem ganz falschen weg, nur wie gehts dann?

edit: achja, was ich auch irgendwie noch nich hinbekommen habe: Wie sag ich Delphi eigentlich, dass eine Prozedur in jedem Programm durchlauf aufgerufen werden soll? Also ich krieg das bisher nur so über diese onClick ereignisse und so hin, aber ich bräuchte das ja so, dass immer neugezeichnet wird..

Danke für jede Hilfe ;)

Mackhack 11. Apr 2007 18:37

Re: Zeichnen auf Video?
 
Zitat:

Zitat von Quetzalcoatl
edit: achja, was ich auch irgendwie noch nich hinbekommen habe: Wie sag ich Delphi eigentlich, dass eine Prozedur in jedem Programm durchlauf aufgerufen werden soll? Also ich krieg das bisher nur so über diese onClick ereignisse und so hin, aber ich bräuchte das ja so, dass immer neugezeichnet wird..

Danke für jede Hilfe ;)

Schleife? Timer?

Quetzalcoatl 11. Apr 2007 18:56

Re: Zeichnen auf Video?
 
Zitat:

Schleife? Timer?
nur wo die Schleife? also ich kann ja nich die Procedure mit einem Klick aufrufen und innerhalb der Prozedur eine Schleife packen die, das neumalen immer wiederholt, weil da würd das Programm ja nich wieder rauskommen und die andern buttons usw. prüfen, oder nicht? Also wenn ich ne Hauptschleife hätte, in der alle Prozeduren und prüfungen aufgerufen wären, dann würd ichs schaffen, aber wo werden diese Prozeduren denn überhaupt aufgerufen? also z.b. die ButtonClick ereignisse.. ich hab immer nur meine Unit geöffnet, in der ich die Prozeduren schreibe. Und im Hauptprogramm stehen auch keine direkten Aufrufe.. mit nem Timer? wie denn?

Quetzalcoatl 11. Apr 2007 21:05

Re: Zeichnen auf Video?
 
So, habs mit dem Timer nu begriffen, bleibt nur das problem das ich das malen über dem Video ruhig immer wieder wieder holen kann, es aber trotzdem nicht drübergemalt wird..
Hat noch wer ne Idee wie man auf ein Video malt? Und was war das mit dem MCI?

Danke,
Quetzalcoatl

Light 11. Apr 2007 21:23

Re: Zeichnen auf Video?
 
Hi Quetzalcoatl,

also um das mit dem Canvas mal zu beleuchten *G*:

Das Video wird sozusagen auch da drauf gemalt
- nur öfter als du da kreise malen kannst-
sonst würde das ja nicht laufen sondern stocken...

MCI - F1 ;-)
hab mich auch mal damit beschäftigt - wollte die Standard ton ausgabe ändern-
das ist richtig kompliziert - finde ich zumindest^^

was mir noch als Möglichkeit einfällt wäre OpenGL zu benutzen.
Auf dieser Seite gibts auch Beispiele mit Filmen...
Allerdings ist das schon sehr aufwändig und kompliziert -
man sollte sich schon ein wenig mit Delphi beschäftigt haben -
sonst verliert man wahrscheinlich zu schnell die Lust/ den Spaß...

Ansonsten vielleicht einfach ein Anderes Panel oder co, was Transparent schalten geht, drüber legen
und da dann drauf malen- könnte nur etwas flackern...

Leuchtende Grüße

Stefan

(alias Light)

Quetzalcoatl 11. Apr 2007 21:48

Re: Zeichnen auf Video?
 
Danke für die Antwort.
Das mit dem Panel drüberlegen hab ich auch probiert. nur wird dann das Video einfach über das Panel drübergemalt, kann man irgendwas machen, das das 2. Panel immer über dem andern ist?
Eine andere Möglichkeit die auch funktioniert, ist ein 2.Form aufzumachen und das Transparent zu machen und genau über das Video zu setzen. Damit kann man dann auf das Video zeichnen. Nur.. wenn ich dann wieder auf das erste Form klicke, verschwindet das 2. wieder in den Hintergrund... kann man da was machen? also im Prinzip sowas wie Form2.showModal, sodass das 2. Formblatt immer über dem ersten ist, nur das man das erste auch noch benutzen kann?
Besser wäre natürlich wenn man ein 2.Panel irgendwie dazubekommen könnte grundsätzlich über dem ersten zu sein..

Edit:
Das mit dem Form2 im Vordergrundhalten hat sich erledigt: Form2.FormStyle := fsStayOnTop;
Ich bin heut wohl bissl zu schnell mit Fragen ;)
Mit den Panels wäre es trotzdem schöner...

Achja und ich hab schon wieder ne Frage.. Ist es eigentlich möglich ein video größer zu machen? und überhaupt die Größe des Videos rauszufinden und sowas?

Sunlight7 11. Apr 2007 23:14

Re: Zeichnen auf Video?
 
Zitat:

Zitat von Quetzalcoatl
Achja und ich hab schon wieder ne Frage.. Ist es eigentlich möglich ein video größer zu machen? und überhaupt die Größe des Videos rauszufinden und sowas?

Delphi-Referenz durchsuchenDisplayRect, Hier im Forum suchenDisplayRect ;)

Irgendwie hab ich immer noch net raus, was Du genau vor hast :gruebel:

Quetzalcoatl 12. Apr 2007 00:02

Re: Zeichnen auf Video?
 
Perfekt ^^ das is genau was ich gesucht hab, danke...
so dann sollte das soweit, mit dem umweg über das zweite Formblatt gehen..
Öh, was ich genau will hab ich nich gesagt stimmt.. weil dann lacht ihr mich ja alle aus ^^
Im Prinzip gehts um Motion Capturing. Also Ich glaub ja nich das das so ganz einfach möglich ist,
im Moment gehts mir auch mehr um das Prinzip. Also ich hab ein Video, wo ich mit Tischtennisbällen an den Gelenken ne Bewegung mache ^^. Dann fängt das Programm an: zuerst werden an verschiedenen Stellen im Video vom Benutzer die Bälle markiert. Es wird ein Rechteck draufgesetzt. So an 6 Stellen oder sowas. Dann werden alle Stellen (also alle Punkte in jedem Rechteck) analysiert auf die Farbe hin und dann ein Mittelwert gebildet, sodass ich die Farbe von den Bällen habe. Dann kommt der nächste Schritt:
Das Video wird abgespielt und wo die Aufnahme starten soll wird gestoppt und es werden die Bälle in diesem einem Frame markiert (wird dann ein roter Kringel drumgemalt). Jetzt wird das video weitergespielt und es werden immer wieder mittels der Referenzfarbe vom Anfang die Bälle gesucht und der Kringel entsprechend nachgeführt.
Darum gehts erstmal. hab das in nem Basic-Dialekt mal programmiert, die Nachführung der Bälle hat sogar funktioniert, das Problem lag höchstens in der Videoqualität. hab halt nur ne Digitalkamera mit 320x240 oder so. Und jetzt will ich das in Delphi schreiben weil mit dem Basic-Dialekt den ich hatte (DarkBasicPro) ist das immer so aufwendig eine ordentliche Umgebung zu schaffen, sprich Buttons usw.
Der nächste Schritt wäre dann die Positionen bzw. Rotationen der Gelenke in irgendein vernünftiges Animationsformat was ich mir noch ausdenken müsste zu packen (wäre dann für 3D-Objekte mit Limbs).. Der Schritt wird wohl bissl schwierig für mich werden und daran wirds wohl dann auch scheitern, aber ich hab schon Spass am Nachführen der Tischtennisbälle ^^ Ein anders Problem ist dann ja auch noch, dass ich mit einer Kamera so ja erstmal auch keine Dreidimensionalität erzeugen kann.. aber was solls ^^
Entschuldigung für den Roman, und danke für eure Hilfe soweit,
Quetzalcoatl

Mackhack 12. Apr 2007 02:09

Re: Zeichnen auf Video?
 
Motion Capturing Algorithmus in C#

Quetzalcoatl 12. Apr 2007 11:19

Re: Zeichnen auf Video?
 
jo um sowas gehts im Prinzip, nur das mir der Algorithmus so nicht weiterhilft, weil der das ganze sich bewegende Objekt registriert und ich ja die Gelenke suche..

Light 12. Apr 2007 13:38

Re: Zeichnen auf Video?
 
Hi Quetzalcoatl,

also ich finde die Idee nicht zum auslachen!
weil du weißt ja selbst (hast es ja auch extra so geschrieben)
das es irgendwo dann verdammt schwierig wird ;-)

Aber so um ein Bisschen mit Video zu experimentieren ists doch klasse!

Hab mal ne Programm geschrieben was ne WebCam eingelesen hat (fremdkomponente *g*)
und dann damit nen bisschen grundlegende Video "Manipulation" ausprobiert...
also negative und co *g*
aber nicht live weil schon alle 10sec ein Bild bearbeiten über Canvase sehr viel
Rechenzeit beansprucht^^

Und ich hab mal versucht so ein "Arlarm-Programm" zu machen - also einfach ein Bild definiert und dann so schnell wie möglich halt jedes neue bild mit dem Vorgaben Bild verglichen und bei zu vielen Abweichungen ne Meldung ausgegeben -
Klingt ja eigentlich einfach - ich musste aber feststellen das so ne Webcam sehr Stark rauscht -
also da schon ohne das sich das licht und irgendwas in dem Raum verändert - sehr starke Schwankungen Vorgabenbild auftreten...
macht aufjedenfall Spaß damit zu Spielen/Experimentieren....

nur momentan bin ich schlichtweg zu geizig mir ne neue Webcam zu kaufen nur weil die alte unter XP nich mehr läuft....

Leuchtende Grüße

Stefan

dizzy 12. Apr 2007 16:12

Re: Zeichnen auf Video?
 
Um dem Timer-Gekrampfe mal ein Ende zu bereiten: TMediaplayer sowie viele andere Videoabspielkomponenten zeichnen nicht einfach auf nem Canvas rum, sondern nutzen ein Fensterhandle als Anhaltspunkt dafür, wo das Overlay hin platziert werden soll. Overlay bedeutet dabei, dass dieser Teil des Bildes komplett an der normalen Windows-Grafik vorbei läuft, und man nicht über die üblichen Methoden an die Bilddaten heran kommt, bzw. sie bearbeiten kann. Im Falle des Mediaplayers handelt es sich dabei um ein DirectX Overlay, und an das zu kommen ist echt nicht trivial (gab es auch mal einige Diskussionen zu im Forum, bezogen auf 3D-Spiele. Da ists das selbe Problem.)
Die einfachste Variante ist es, garkeine Playerkomponente an sich dafür zu bemühen, sondern sich die Bilddaten Frameweise aus der Datei zu holen. Um dies zu tun, kann man sich ewig mit der API für Videocodecs beschäftigen, oder man nimmt z.B. Hier im Forum suchenDSPack dafür :). Damit lässt sich ein komplettes Video in Bitmaps zerlegt bearbeiten, und je nach dem wie schnell dies von statten geht, kann man nun noch selbst für die Anzeige sorgen. (Alternativ halt wieder mit dem DSPack ein zweites Video encodieren mit den Änderungen.)

Jeder Versuch einfach so auf ein Video zu zeichnen, wird im aller besten Fall flackern wie Hölle, wenn überhaupt ;)

Sunlight7 12. Apr 2007 17:54

Re: Zeichnen auf Video?
 
Zitat:

Zitat von dizzy
Um dem Timer-Gekrampfe mal ein Ende zu bereiten: TMediaplayer sowie viele andere Videoabspielkomponenten zeichnen nicht einfach auf nem Canvas rum, sondern nutzen ein Fensterhandle als Anhaltspunkt dafür, wo das Overlay hin platziert werden soll. Overlay bedeutet dabei, dass dieser Teil des Bildes komplett an der normalen Windows-Grafik vorbei läuft, und man nicht über die üblichen Methoden an die Bilddaten heran kommt, bzw. sie bearbeiten kann. Im Falle des Mediaplayers handelt es sich dabei um ein DirectX Overlay, und an das zu kommen ist echt nicht trivial (gab es auch mal einige Diskussionen zu im Forum, bezogen auf 3D-Spiele. Da ists das selbe Problem.)

Du verwechselt den TMediaPlayer (MCI) mit dem Windows MediaPlayer (DirectShow).
MCI nutzt die Standard GDI, DirectX gabs in Win 3.x noch gar net. :zwinker:
DirectShow nutzt Overlays, aber nur wenn sie nicht deaktiviert wurden... :angel2:

Zitat:

Zitat von dizzy
Jeder Versuch einfach so auf ein Video zu zeichnen, wird im aller besten Fall flackern wie Hölle, wenn überhaupt

Denkste, mein Player zeichnet auf ein Video (indirekt), um Titel und Interpret anzuzeigen, ohne Flimmern :stupid: Guckste
Wenn man sich in den Draw-Handler einklinkt geht das auch direkt, war mir aber zu mühsam :roll:

@Quetzalcoatl: Du kannst es mit wie es dizzy beschrieben hat ohne Player machen, oder es, wo Du es schon mit dem MediaPlayer versuchst es auf ein Panel abspielen lassen und dieses bei jedem MCI Signal in ein Bitmap zu Capturen, womit Du dann mit ScanLine schneller zugreifen kannst.
Obwohl ich dazu sagen muß, so ist es einfacher zu Programmieren, aber benötigt auch etwas mehr Rechenzeit der CPU...

Quetzalcoatl 13. Apr 2007 01:01

Re: Zeichnen auf Video?
 
So, schon wieder ne Frage:
ich versuche gerade die Position des Videos über ne Trackbar verstellbar zu machen.
Also Die Trackbar soll wenn Play gedrückt wird mitlaufen.. Soweit kein Problem, hab in nem Timer einfach:
Trackbar1.Position:=MediaPlayer1.Position;
Nur sollte man über die Trackbar auch selber noch eine beliebige Position einstellen können. Das hatte ich auch schonmal am Laufen, aber immer nur das eine oder das andre. also entweder die Trackbar läuft schön mit dem video oder ich kann selber die position über die trackbar verstellen.. Wie krieg ich jetzt beides zusammen?
Oder gibts was um zu prüfen ob das Video grad läuft, dass man halt "Trackbar1.Position:=MediaPlayer1.Position;" nur dann macht wenn play gedrückt wurde?

Danke für jede Hilfe,
Quetzalcoatl

Sunlight7 13. Apr 2007 02:27

Re: Zeichnen auf Video?
 
Schau mal nach Delphi-Referenz durchsuchenTMediaPlayer.Mode

Du könntest das auch so einbauen, das Du in der TrackBar.OnChange guckst, ob die den Fokus hat, nur so ne Schnapsidee am Rande :stupid:

Delphi-Quellcode:
If TrackBar1.Focused then
   MediaPlayer1.Position:=TrackBar1.Position else
      TrackBar1.Position:=MediaPlayer1.Position;

dizzy 13. Apr 2007 05:24

Re: Zeichnen auf Video?
 
Zitat:

Zitat von Sunlight7
Du verwechselt den TMediaPlayer (MCI) mit dem Windows MediaPlayer (DirectShow).
MCI nutzt die Standard GDI, DirectX gabs in Win 3.x noch gar net. :zwinker:

Leuchtet ein, in der Tat - ich geb mich geschlagen =)
Zitat:

Zitat von Sunlight7
DirectShow nutzt Overlays, aber nur wenn sie nicht deaktiviert wurden... :angel2:

Wer würde soooowas denn tun? ;)

Zitat:

Zitat von Sunlight7
Denkste, mein Player zeichnet auf ein Video (indirekt), um Titel und Interpret anzuzeigen, ohne Flimmern :stupid: Guckste
Wenn man sich in den Draw-Handler einklinkt geht das auch direkt, war mir aber zu mühsam :roll:

Muss ich mir mal anschauen. Ich nehme aber mal an, dass du es dann via TMediaPlayer gemacht hast? Wenn es aber ein Overlay ist, so hast du meine volle Aufmerksamkeit 8)

Zitat:

Zitat von Sunlight7
@Quetzalcoatl: Du kannst es mit wie es dizzy beschrieben hat ohne Player machen, oder es, wo Du es schon mit dem MediaPlayer versuchst es auf ein Panel abspielen lassen und dieses bei jedem MCI Signal in ein Bitmap zu Capturen, womit Du dann mit ScanLine schneller zugreifen kannst.
Obwohl ich dazu sagen muß, so ist es einfacher zu Programmieren, aber benötigt auch etwas mehr Rechenzeit der CPU...

Dann ists ja schon fast egal wie rum man es macht. Bei der Variante übern Player müsste man dann zusehen, dass die Bearbeitung mit der Framerate einigermaßen mithalten kann, und bei der anderen Variante hat man die Framerate selber voll unter Kontrolle, was natürlich mit etwas mehr Arbeit bei der Anzeige verbunden ist. Für akkurates Motioncapturing würde ich eher keinen Player nehmen (ausser man lässt ihn quasi als Decoderknecht in Einzelschritten laufen), da die Verarbeitung idR nicht soooo fix geht, je nach gewünschter Güte des Ergebnisses. Wenn man eher einfache Dinge tun will, wie z.B. nur feststellen ob sich generell das Bild ändert o.ä., dürfte ein Player aber komfortabler sein. Damit wirds dann, wie so oft, eine Frage von "Was will ich im Detail tun, und womit fühl ich mich wohler" =)

Sunlight7 13. Apr 2007 05:55

Re: Zeichnen auf Video?
 
Zitat:

Zitat von dizzy
Wer würde soooowas denn tun?

Leute, die in ihrem 4x86er PC eine Local VESA Bus Grafikkarte haben, die nur DirectDraw 1 kann, für Overlays es aber DirectDraw 2 braucht :lol:

Zitat:

Zitat von dizzy
Ich nehme aber mal an, dass du es dann via TMediaPlayer gemacht hast?

Sunlight7 hat in einem anderen Thread folgendes geschrieben:
Gelegentlich gibt die Eigenschaft .Mode vom TMediaPlayer Werte aus, die gar net in den TMPModes vorhanden sind :stupid:

Solltest Du also das machen, wie es das Beispiel in der OH zeigt kannst Du schon mal einen Crash erleben. :roll:

Ähm ne, ich hab mir ne eigene Kompo gebastelt, die MCI direkt anspricht, die TMediaPlayer Kompo hat mich zu sehr genervt und MCI bietet vielmehr Funktionen, als sie der TMediaPlayer anbietet.


Zitat:

Zitat von dizzy
Dann ists ja schon fast egal wie rum man es macht. Bei der Variante übern Player müsste man dann zusehen, dass die Bearbeitung mit der Framerate einigermaßen mithalten kann, und bei der anderen Variante hat man die Framerate selber voll unter Kontrolle, was natürlich mit etwas mehr Arbeit bei der Anzeige verbunden ist. Für akkurates Motioncapturing würde ich eher keinen Player nehmen (ausser man lässt ihn quasi als Decoderknecht in Einzelschritten laufen), da die Verarbeitung idR nicht soooo fix geht, je nach gewünschter Güte des Ergebnisses. Wenn man eher einfache Dinge tun will, wie z.B. nur feststellen ob sich generell das Bild ändert o.ä., dürfte ein Player aber komfortabler sein. Damit wirds dann, wie so oft, eine Frage von "Was will ich im Detail tun, und womit fühl ich mich wohler" =)

MCI bietet da die Möglichkeit, bei jedem Frame ein Signal zu bekommen, bzw. kann man die Wiedergaberate herabstellen, sollte es die CPU net schaffen.
Net das optimalste, aber mal was zum rumspielen und probieren :cyclops:

Light 13. Apr 2007 11:53

Re: Zeichnen auf Video?
 
Hi Ihr,

MCI - ja es bietet viiiiiieeeeeeellllle Möglichkeiten -
aber nur wenn man weiß wies funktioniert ;-)

- Ich hab mal den TMediaPlayer so umgeschrieben bzw. erweitert
das man noch einstellen konnte welche Soundkarte er Nutzen soll -
(falls mehrere Installiert sind...)
So als "DJ-Player" dann halt mit zwei Playern und einem zum Vorhören die dann erst am Mischpult gemixt werden sollen und nicht automatisch....

es hat irgendwann auch mal so einigermaßen Funktioniert - allerdings nur mit Wavdateien
da der TMediaPlayer dann für MP3 immer ja den umweg übers deCodieren macht...
und da hab ich dann immer nur ne schöne Fehlermeldung bekommen
ala "Dieser Befehl wird von Diesem Medium nicht unterstützt!"

und ich musste mich sehr sehr lange durch die OH schlagen und
hier in der DP suchen bis ich überhaupt mal einen blassen schimmer
davon hatte wie das funktioniert...
.. ist auch schon ein bisschen länger her

Leuchtende Grüße

Stefan

Quetzalcoatl 13. Apr 2007 14:11

Re: Zeichnen auf Video?
 
Hi, Also die Trackbar funktioniert jetzt soweit: Wenn das Video spielt wird halt da mitgeschoben und wenn es nicht spielt kann man selber den Schieber bewegen... Ich komm immer nie auf die Funktionen wie z.b. Focused oder das mit dem MediaPlayer.Mode=mpPlaying.. is für mich nich so intuitiv im Moment ^^ ich kenn nur von Basic: if video Playing() ^^ Da konnte man einfach schreiben was man wollte ^^
Und mir kommt es so vor als würde die Delphihilfe mir auch nich alle Befehle ausspucken -.-

argh und da is schon wieder ein Problem.. Ich muss ja zwangsläufig die RGB Werte eines Pixels auf dem Video rausfinden können.. mit Canvas.Pixels scheint das irgendwie nich zu funktionieren, bleibt das Canvas wohl unberührt von dem Video? Ich find einfach keine Funktionen sonst die mir Pixeldaten geben.. hm..

Light 13. Apr 2007 14:45

Re: Zeichnen auf Video?
 
Hi,

durchforste doch mal selbst die Eigenschaften des TMediaPlayer und vieleicht gibts da irgendwie ein Handel zur eigentlichen Zeichenfläche - weil scheinbar gibt er es ja nicht direkt auf dem Canvas wieder-

aber wie du aus dem TColor Wert die RGB Werte raus bekommst weist du?

Leuchtende Grüße

Stefan

Quetzalcoatl 13. Apr 2007 15:58

Re: Zeichnen auf Video?
 
HI..
also als ich mit Canvas.Pixels die Farben gesucht hab, hab ich die jeweiligen Werte versucht mit GetRValue GetgValue und GetBValue die einzelnen Farbwerte gesucht..
Dann gibts ja da scheinbar noch eine Funktion GetPixel(hdc, nxpos,nypos).. Die gibt mir auch einen Farbwert und mit GetRValue usw. kann ich offensichtlich auch die einzelnen Komponenten rausfinden.. nur.. das klappt bei mir bisher noch nicht auf dem Video.. wobei ich auch nicht so recht weiß was bei 'hdc' hin muss. Also ich hatte diesen Codeschnippsel dazu gefunden:
Delphi-Quellcode:
    dc := GetDC(0);
    r := GetPixel(dc, Mouse.CursorPos.x, Mouse.CursorPos.Y);
    ReleaseDC(0, dc);

Light 13. Apr 2007 17:11

Re: Zeichnen auf Video?
 
Hi Quetzalcoatl,

also h steht meist für handel ;-)
und DC würde ich jetzt mal mit Device Context oder so was übersetzen.
also ist das das Handel für die Fläche wo er den Pixel her nehmen soll!

also genau das was du willst!

Jetzt musst du nur noch das handel von der Oberfläche haben wo der Film
drauf läuft^^

Ich tippe mal das GetDC(0) dir das Handel deiner Form oder so in der Richtung zurückliefert.

Notfalls der Bildschirm ;-)
allerdings musst du dann halt erst mal noch den Ausschnitt errechnen wo dein Video überhaupt läuft...

hoffe dir helfen zu können!

Leuchtende Grüße

Stefan

PS: Falls ich mich Irre dann bitte ich dringend um Berichtigung - ich will was lernen^^
PPS: Wieso ich das mit dem DC weiß bzw. woher? --> bei OPEN GL muss man auch den DC angeben damit er weiß wo er hinmalen soll!

Sunlight7 13. Apr 2007 17:46

Re: Zeichnen auf Video?
 
Da mein Beitrag von 15:40 Uhr verschwunden is :cry: Nochmals...

Mit Canvas.Pixels würd ich das sowieso net machen, das ist extra langsam X-D

Ich weiß jetzt grad net, welche Delphi Version Du hast, jedenfalls haben Panels bei mir kein Canvas, deshalb habe ich mit MSDN-Library durchsuchenGetDC und MSDN-Library durchsuchenBitBlt einen Schnappschuß gemacht. Screenshot
Dann kannst Du es mit Hier im Forum suchenScanLine auf einer Bitmap weiter bearbeiten.

@Light: GetDC(0) gibt ein Device Context vom Desktop, nicht vom Fenster ;)

Quetzalcoatl 13. Apr 2007 21:12

Re: Zeichnen auf Video?
 
Hi,

Also mit GetDC(0) krieg ich doch theoretisch dann vom ganzen Bildschirm die Pixeldaten? klappt auch, solange kein Video geladen ist. wenn ich das Video auf dem Panel habe, funktioniert die Funktion nich mehr (nur auf dem Panel nicht) bzw. gibt konstante Werte aus, was aber nicht passen kann.
Wie krieg ich denn das Handle von der Oberfläche wo der Film drauf läuft. Habs mit MediaPlayer1.Display.Handle und solchen sachen probiert, aber kommt nix komischer weise.. Theoretisch müsste das doch mit GetDC(0) gehen, funktioniert doch bei allem andern auch, sogar außerhalb des Programms. Wenn ich nebenbei dasselbe Video vom WindowsMediaPlayer, also extern abspielen lasse klappt das mit dem GetPixel perfekt.

Hat grad sogar zwischen durch mal in meinem Programm selbst funktioniert, woran das lag hab ich nich rausgefunden, jetzt gehts auf jedenfall nicht mehr.. irgendwie ist das komisch.

Light 13. Apr 2007 21:32

Re: Zeichnen auf Video?
 
Hm,

also tut mir sehr leid-
mehr weiß ich leider auch nicht-

überleg genau was war als es funktioniert hat^^

vielleicht war irgend ein anderes Programm "schuld"

Leuchtende Grüße

Stefan

PS: mich würde es schon Interessieren wie es dann funktioniert...

Quetzalcoatl 13. Apr 2007 21:35

Re: Zeichnen auf Video?
 
Ja, hab ich auch gedacht das ein andres Programm Schuld war, das einzige (zumindest was mir einfällt) was anders war, war eben das der WindowsMediaPlayer nebenbei auch ein Video abgespielt hat.. Erst ging mein eigenes Programm nicht, dann hab ich ein anderes Video darin geöffnet, dann gings aufeinmal. dann hab ich das Video vom Anfang geöffnet und es ging immernoch.. Als ich dann mein Programm neugestartet hab (ohne Codeänderung) ging wieder nix mehr.. bissl seltsam das ganze

Edit:
Argh.. Es hat ja mal geklappt also muss es irgendwie ja auf diese Weise gehen.. Sonst bleibt mir wohl nur die Screenshotmethode, wobei die wird bestimmt dann bisschen langsam

Edit2:
So Für alle dies interessiert: Meine Lösung fürs erste ist einfach keine WindowsMediaPlayer Videos oder MPEG zu benutzen sondern .avi Videos -.- Mit denen funktionierts.. Vielleicht weiß ja sogar einer warum das so ist?

Sunlight7 13. Apr 2007 22:54

Re: Zeichnen auf Video?
 
Hmm, seltsame Sache, mit MPEG funkts echt net :gruebel:

Aber für AVIs kannst Du das nehmen:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
   var DC:HDC;
begin
   DC:=GetDC(Panel1.Handle);
   BitBlt(Bit.Canvas.Handle, 0, 0, 384, 288, DC, 0, 0, SRCCOPY);
   ReleaseDC(Panel1.Handle, DC);

   Canvas.Draw(384, 0, Bit);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Bit:=TBitmap.Create;
   Bit.Width:=384;
   Bit.Height:=288;
end;

Quetzalcoatl 13. Apr 2007 23:30

Re: Zeichnen auf Video?
 
Hi, Danke nochmal für eure ganze Hilfe.

@Sunlight7:
Für Avi´s funktionierts ja auch einfach so, oder meintest du für MPEG?
Find das immernoch ein bisschen seltsam das MPEG´s da anders sind als die avi´s

Sunlight7 13. Apr 2007 23:50

Re: Zeichnen auf Video?
 
Das was ich gezeigt habe is für AVIs

Das liegt da dran, das MCI aus mehreren Komponenten besteht, jeder MCI-Treiber hat so seine Eigenheiten.
Übrigens funkt das mit den MPEGs bei mir unter Win95 :gruebel:

Quetzalcoatl 13. Apr 2007 23:55

Re: Zeichnen auf Video?
 
Hi

Was macht denn dein Code genau? Also es wird ein Bitmap erstellt und dann im Timer das Bild vom Panel1 auf die Bitmap kopiert und das ganze wird mit Canvas.Draw angezeigt? Bzw. Wozu genau?

Sunlight7 14. Apr 2007 01:00

Re: Zeichnen auf Video?
 
Moin,

das Bitmap wird schon im FormCreate erstellt.

Der Code kopiert lediglich das DC vom Panel auf die Bitmap, wenn der Timer 40 MS lief, war rechts das Original Video zu sehen und links lief die Livekopie davon.

Wenn Du es auf eine Bitmap kopierst kannst Du mit Hier im Forum suchenScanLine viel schneller drauf zugreifen als mit GetPixel


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 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