Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

11.04.2011, 15:02

Alles klar! Ich hab zumindest erstmal ne Grundlage. Unter Windows Xp mit VS 2008 läuft jetzt auch alles sauber. Ich denke mit Windows 7 wirds sowieso noch mehr Probleme geben, besonders wenn ich mal an 64bit Anwendungen denke. Beispielcodes für andere Player hab ich auch schon gefunden. Allerdings nur in VB und C#. Ich werde damit mal ein wenig rumexperimentieren. Interessant ist in dem einen Beispiel auch das ich sogar SPDIF als Soundausgabe anwählen kann. Mal sehen ob ich dem ganzen ein paar DD 5.1 Töne entlocken kann.

Danke fürs mitlesen. Bis dann. :thumbup:

12

12.04.2011, 18:14

Für alle die es noch interessiert und die Probleme unter Windows 7 haben, hier ein Lösungsansatz:

Man nimmt aus dem Windows SDK die Module dshowplayer.cpp und video.cpp und die zugeh. Header aus dem Verzeichnis
../Samples/multimedia/directshow/players/dshowplayer
(Das ist ein einfacher Videoplayer der problemlos compiliert und gestartet werden kann).
Diese beiden Module bindet man in das Videobeispiel aus Kap. 9 mit ein und entfernt den ganzen tbVideo-Code. Dann erzeugt man eine Instanz des neuen Players:
DShowPlayer* pPlay; //als globale Var.

... (ab hier alles in WinMain)...
hWnd=tbDirect3D::Instance().GetWindow();
pPlay = new DShowPlayer(hWnd); //hWnd ist Windowhandle von D3D-Instanz
...
hr = pPlay->OpenFile(acVideoFilename); //übergeben des Filenamens, z.B. aus Openfile-Dialog
RECT rcWindow;
GetClientRect(hWnd, &rcWindow);
pPlay->UpdateVideoWindow(&rcWindow); //zuweisen des Windows
...
pPlay->Play(); //Player einfach starten

Zum Schluss nicht vergessen in CleanUp():
SAFE_DELETE(pPlay); //beim Beenden den Player wieder löschen


Da in der Tribase-Engine allerdings in der Messageloop die Present() Methode für die ganze 3D Umgebung ständig automatisch aufgerufen wird, muss man diesen Vorgang schaltbar machen. Ich habe nämlich festgestellt, dass beim abschalten von tbDirect3D::Instance().Present() in der Messageloop, das Video problemlos abspielbar war. Den Code in MoveProc und RenderProc braucht man dann ebenfalls nur von diesem Schalter abhängig machen, falls man danach noch 3D Ausgaben machen möchte. D.h. wenn das Video zuende ist, schaltet man eben wieder auf 3D Rendering um. Das ganze ist also ziemlich simpel und man hat dafür eine gute und flüssige Videoausgabe (...habe noch keine Ruckeleffekte festgestellt). :thumbsup: