Hi,
in diesem Tutorial werde ich zeigen, wie man in Irrlicht ein Video abspielt. Der Code, den ich verwende stammt von juliusctw und wurde verändert von Hansel.
Weiteres unter
http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=6389
Fangen wir also an:
Als erstes benötigt man ffmpeg. Dies liefert die benötigten Funktionen und Codecs, um Filme abzuspielen. Es kann unter
http://ffmpeg.mplayerhq.hu/ heruntergeladen werden.
Dies muss über svn geschehen, da es sich noch in Entwicklung befindet. Unter Linux gibt man einfach
Code:
svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
in die Konsole ein. Unter Windows braucht man dazu einen svn-Client.
Dannach muss es kompiliert und installiert werden. Die Anweisungen dazu, kannst du der Dokumentation entnehmen.
Desweiteren braucht man folgende Dateien: videoPlayer.h und videoPlayer.cpp. Diese können
hier heruntergeladen werden.
Wenn die vorbereitenden Schritte erfolgreich abgeschlossen wurden, können wir nun anfangen.
Als erstes muss man ein neues Irrlichtprojekt erstellen (siehe Tutorial 1). Ist das geschafft, müssen noch folgende Libarys zusätzlich eingebunden werde:
Code:
-lavformat
-lavcodec
-lavutil
Diese werden von ffmpeg benötigt.
Jetzt müssen noch die Dateien videoPlayer.h und videoPlayer.cpp zum Projekt hinzugefügt werden.
Jetzt aber zum Code.
Als erstes werden die benötigten Header-Dateien eingebunden und die Namespaces verwendet.
Code:
#include <irrlicht.h>
#include "videoPlayer.h"
#include <stdio.h>
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
using namespace irr;
Dannach werden die Zeiger auf die benötigten Irrlichtobjekte dekariert.
Code:
IrrlichtDevice *device;
IVideoDriver* driver;
ISceneManager* smgr;
Jetzt das erste neue. Wir deklarieren einen Zeiger auf den Videoplayer, damit wir diesen dann verwenden können.
Code:
cVideoPlayer* videoPlayer;
Jetzt erstellen wir unseren Eventreciver, damit wir das abspielen des Videos steuern können
Code:
class MyEventReceiver : public IEventReceiver
{
public:
virtual bool OnEvent(SEvent event)
{
if (event.EventType == irr::EET_KEY_INPUT_EVENT && !event.KeyInput.PressedDown)
{
switch (event.KeyInput.Key)
{
Jetzt wollen wir, das bei einem Druck auf die Taste 'A' das Video abgespielt wird:
Code:
case KEY_KEY_A: videoPlayer->play();
printf("-> Play\n");
break;
Bei 'S' die wiedergabe pausiert wird und mit 'D' die das Video gestoppt wird.
Code:
case KEY_KEY_S: videoPlayer->pause();
printf("-> Pause\n");
break;
case KEY_KEY_D: videoPlayer->stop();
printf("-> Stop\n");
break;
return true;
}
}
return false;
}
};
Damit währe der Eventreciver auch schon fertig.
In der main-Funktion wird jetzt standartmäßig ein Irrlichtdevice erzeugt und alles nötige Initialisiert.
Code:
int main(int argc, char *argv[])
{
MyEventReceiver receiver;
device = createDevice( video::EDT_OPENGL, dimension2d<s32>(640, 480), 32, false, false, false, &receiver);
driver = device->getVideoDriver();
smgr = device->getSceneManager();
Anschließend wird er Videoplayer erstellt.
Code:
videoPlayer = new cVideoPlayer(driver, device->getTimer(), "Video.avi");
Dazu wird eine Zeiger auf den VideoDriver übergeben, der Timer und den Dateinamen des Videos.
Jetzt sagen wir noch, dass das Video nicht in eine Schleife abgespielt werden soll
Code:
videoPlayer->setLoop(false);
Das währe es auch schon für die Initialisierung gewesen. Jetzt müssen wir das Video nur noch anzeigen. Dafür erzeugen wir wie gewohnt eine Renderschleife
Code:
// to get the framerate (fps)
int lastFPS = -1;
while (device->run())
{
static int i = 0;
driver->beginScene(true, true, SColor(255,100,101,140));
Jetzt wird
Code:
videoPlayer->refresh();
aufgerufen, damit zu gegebener Zeit ein neues Bild angezeigt wird.
Jetzt müssen wir nur noch
Code:
videoPlayer->drawVideoTexture();
aufrufen und unser Video wird in einem Rechteck dargestellt.
Jetzt nur noch alle abschließenden Schritte durchführen und fertig ist der eigene Videoplayer
Code:
driver->endScene();
// show the framerate (fps)
int fps = driver->getFPS();
if (lastFPS != fps)
{
wchar_t tmp[1024];
swprintf(tmp, 1024, L"Video Example - Irrlicht Engine [%ls] fps: %d",
driver->getName(), fps);
device->setWindowCaption(tmp);
lastFPS = fps;
}
}
device->drop();
return 0;
}
Bei Fragen und Anregungen kann man sich gerne an mich wenden.
Gruß Paul Elsner