Aktuelle Zeit: 22.12.2024, 21:12

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: 19.04.2007, 12:32 
Offline

Registriert: 16.03.2007, 03:26
Beiträge: 75
Wohnort: Dresden
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


Zuletzt geändert von brainos am 22.04.2007, 21:04, insgesamt 2-mal geändert.

Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 19.04.2007, 19:44 
Offline
Moderator

Registriert: 25.02.2007, 14:35
Beiträge: 323
Wohnort: Münster
Sehr schön, vielen Dank :D

Ich habs jetzt net auf Funktionalität getestet, aber vom Stil und Aufbau her finde ich das Tutorial gelungen.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 20.04.2007, 20:02 
Offline
Benutzeravatar

Registriert: 17.04.2007, 08:42
Beiträge: 460
Wohnort: Willich, NRW
ich finde auch das es sehr gut erklärt ist. doch als ich versucht habe mir ffmpeg zu ziehen kam ich über keinen link zu einem download. (ich habe auch nicht alle ausprobiert, aber die wichtigsten :-)) kannst du bitte noichmal den genauen link angeben. danke schön

mfg das heck


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 22.04.2007, 21:05 
Offline

Registriert: 16.03.2007, 03:26
Beiträge: 75
Wohnort: Dresden
habs editiert.....


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 26.04.2007, 14:27 
Offline

Registriert: 02.04.2007, 13:08
Beiträge: 11
ok also beim kompilieren bekomme folgenden fehler:
fatal error C1083: Cannot open include file: 'inttypes.h': No such file or directory

also hab ich mal den include pfad von mingw mit eingebunden und nun kommt nen neuer:
fatal error C1021: invalid preprocessor command 'include_next' c:\mingw\include\stdarg.h 6

hat wer nen plan wie ich das behebe?

mfg bash

Ps: ich benutze vs2005


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 26.04.2007, 14:36 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
benutz gcc ;)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 26.04.2007, 20:16 
Offline

Registriert: 16.03.2007, 03:26
Beiträge: 75
Wohnort: Dresden
@frodenius: würds zwar nicht ganz so ausdrücken....

@Bash: du kannst nicht einfach Bibliotheken oder Headerdateien von mingw für VisualS nehmen, da ist vorherzusehen, das du Fehlermeldungen bekommst.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 27.04.2007, 10:16 
Offline

Registriert: 02.04.2007, 13:08
Beiträge: 11
jor also das mit dem mingw include ordner ist ja nur nen test gewesen …
hab jetzt einfach folgende änderungen gemacht

ffmpeg\common.h:

Code:
#include <inttypes.h>


wurde durch

Code:
#if !defined(WIN32) || !defined(_MSC_VER)
   #include <inttypes.h>
#else
   #include <basetsd.h>
   typedef UINT8   uint8_t;
   typedef UINT16  uint16_t;
   typedef ULONG32 uint32_t;
   typedef UINT64  uint64_t;
   typedef INT8    int8_t;
   typedef INT16   int16_t;
   typedef LONG32  int32_t;
   typedef INT64   int64_t;
#endif


ersetzt
und in VidoePlayer.cpp wurde

Code:
#include <unistd.h>

durch
Code:
#if !defined(WIN32) || !defined(_MSC_VER)
   #include <unistd.h>
#else
   #include <io.h>
#endif

ersetzt

naja und nun tauchen folgende fehler auf:
Error 7 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup LIBCMTD.lib

Error 8 fatal error LNK1120: 1 unresolved externals c:\Projekt-Entwicklung\Irrlicht1.3\bin\Win32-VisualStudio\Test.exe 1
und ? hat wer nen vorschlag zur lösung des problems ?

mfg bash


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 27.04.2007, 12:06 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
entweder keine main() funktion oder eine WinMain() in einem consolen projekt

oder du linkst die falsche runtime

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 03.05.2007, 09:34 
Offline

Registriert: 02.04.2007, 13:08
Beiträge: 11
ach daher ist mir der fehler so bekannt vorgekommen (schreibfehler in main())
... danke

so fehlermeldungen bekomm ich keine mehr aber dafür wird mein video nicht richtig dargestellt

Bild

woran liegt das nun schon wieder ?


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 11.05.2007, 16:41 
Offline

Registriert: 11.05.2007, 16:35
Beiträge: 31
Wo finde ich die header datei videoPlayer.h ?


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 13.05.2007, 19:07 
Offline

Registriert: 16.03.2007, 03:26
Beiträge: 75
Wohnort: Dresden
Die findest du, wenn du dir die Datei 'Video-Irrlicht.zip" herunterlädst. Ist oben verlinkt.

@Bash: tud mir leid, kann dir leider nicht sagen woran das liegen könnte, hat vielleicht hier jemand anderes das Problem und könnte helfen?
Dau kannst auch dir mal den Thread im Englischen Forum anschauen (link oben), vielleicht hilft dir das weiter.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de