Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 08:58

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Jul 22, 2008 11:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi,

ich verwende FFMpeg bzw. FFDec (FFMpeg als Bibliothek gelinkt+Wrapper) um Videos zu dekodieren. Ich möchte die natürlich nicht nur dekodieren sondern auch wirklich abspielen, also auch zeichnen. Man könnte einen Multimediatimer verwenden. Damit habe ich mich allerdings noch nicht beschäftigt und daher dachte ich, OpenGL wäre für mich besser (bin natürlich noch von dieser Meinung abzubringen, wenn ihr Argumente dagegen bringt). Nun gibt es zwei Fragen, welche beide sehr wichtig für mich sind:
1. FFMpeg liefert mir nun Fetzen und diese müssen gezeichnet werden. Wie geht so etwas am besten ? Ich kenne mich in Bezug auf Timing mit OpenGL nicht so gut aus, ich denke bloß, dass man 24 Frames pro Sekunde zeichnen sollte, aber wie kriegt man das genau hin ? Muss die FPS berücksichtigt werden ? Hier das Codebeispiel (Konsolenanwendung ohne irgendeine GUI), in dem gezeigt wird, wie das Dekodieren mithilfe von FFDec funktioniert. Der oben besagte Link bringt euch abgesehen von der pthreadGC2.dll alles zum Dekodieren mit, falls ihr mithilfe des folgenden Codes selbst mal was probieren möchtet. Ist es eigentlich sinnvoll den Puffer auf 1MB zu setzen oder sollte dieser größer/kleiner sein ?
Code:
  1. program Video;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils, FFDecImport;
  7.  
  8. var Decoder : HFFDecoder;
  9.     Info    : AVInfo;
  10.     Packet  : PAVPacket;
  11.     Puffer  : Array [0..1023] of Byte;
  12.     Size    : Integer;
  13. begin
  14.   Decoder := ffOpenFile('Video.mpeg', Info);
  15.   Packet  := ffCreateAVPacket(True);
  16.   try
  17.     while ffRead(Decoder, Packet, FFDEC_RAW_FRAME_TYPE_ANY) do
  18.     begin
  19.       if Packet.stream_index = Info.audioStreamIndex then
  20.       begin
  21.         if ffDecode(Decoder, Packet, @(Puffer[0]), Length(Puffer), Size) then
  22.           // Audiosamples spielen
  23.           WriteLn('Audio: ', Size);
  24.       end else
  25.       if Packet.stream_index = Info.videoStreamIndex then
  26.       begin
  27.         if ffDecode(Decoder, Packet, @(Puffer[0]), Length(Puffer), Size) then
  28.           // Zeichnen, Bild ist hier im BGR24-Format
  29.           WriteLn('Video: ', Size);
  30.       end;
  31.       Sleep(100);
  32.     end;
  33.   finally
  34.     ffFreeAVPacket(Packet);
  35.     ffClose(Decoder);
  36.   end;
  37. end.


2. Unter Vista kann man OpenGL nicht mehr in Verbindung mit der GDI verwenden bzw. man hat glaube ich nur noch OpenGL 1.3. Genügt OpenGL 1.3 um Videos abzuspielen oder wäre es geschickter NonVCL zu programmieren ? Es muss die NonVCL-Programmierung allerdings unter Lazarus möglich sein, denn wenn schon NonVCL dann möglichst auch unter Linux (ist natürlich nicht unbedingt so wichtig, schadet aber nicht, da es nunmal kleiner und schneller ist). Dann stellt sich allerdings die Frage, ob das nicht zu aufwändig wäre: Canvas benötige ich zum Zeichnen der eigenen GUI (ich möchte OpenGL als Alternative zur Verfügung stellen, allerdings muss die normale Variante via Canvas auch funktionieren) und eine ListView wäre auch nicht schlecht. Ich habe gerade erst die ListBox hinter mir und ich will nicht wissen wie brutal es ist eine ListView auf Canvas-/OpenGL-Basis zu programmieren - es kostet wahrscheinlich viel Zeit und das möchte ich eher vermeiden. Als Alternative hätte ich, unter Linux OpenGL zu verwenden und unter Windows DirectX, allerdings habe ich vor Jahren mal sehr grundlegend was mit DirectX gemacht und weiß eigentlich nichts mehr darüber (lässt sich natürlich wieder auffrischen). Abgesehen davon hat DirectX den Nachteil der fehlenden Abwärtskompatiblität und ich möchte mit DirectX 10 mal knallhart gesagt niemals etwas zu tun haben - zumindest nicht als Programmierer. Was wäre die beste Lösung für dieses Problem ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 22, 2008 11:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich empfehle OpenGL, ist bisher die einzige möglichkeit gewesen, neben einen D3D Context(z.B. WoW,StarCraft,...) noch auf mein 2. Monitor noch filme zu gucken. GDI, DD, Overlay gehen nicht, da bleibt das Bild entsprechend Schwarz oder der overlayfarbe.
Im prinzip kannst du dein Frame decodieren, in den Backbuffer zeichnen und dann über ein Timer solange pausieren, bis das nächste Frame gebraucht wird(1000/videosrc.fps=delay).
Der delay sollte möglichst unter dem berechneten liegen, da du sonnst um einige ms den frame verpasst.
Da die Videoquellen unterschiedliche FPS haben z.B. PAL mit 24.quetsch und 27.quetsch, NTSC mit 29.quetsch und dann so weiter, solltest du die wartezeit für dein timer immer für jede quelle berechnen.
Der Ideale delay wäre 1000/FPS/2 = 500/FPS, dann kannst du wärend eines Frame 2 prüfungen machen(Shannon lässt grüssen).
Mehr als 2 abfragen pro Frame wäre auch ein bischen CPU lastig, für mobile cpus nicht so nett.

Unter Vista hab ich GDI verwendet, um mein Fenster zu erstellen und dort hatte ich auch OpenGL2.1.
Schau dir doch mal wxWidget an, dass ist ein cross framework.
Ich z.B. baue damit aktuell 2 Tools mit.
Mein Welt Editor.
http://karmarama.linuxprofessionals.org/upload/worldeditor04.JPG
Im Anhang noch ein screenshot des 2. Tools, AlgoTex schreib ich im Rahmen meiner Bachelorarbeit.
wxWidget kann man OpenGL ohne Probleme auf ein Panel oder ähnliches verwenden.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 4 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]