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:
program Video;
{$APPTYPE CONSOLE}
uses
SysUtils, FFDecImport;
var Decoder : HFFDecoder;
Info : AVInfo;
Packet : PAVPacket;
Puffer :Array[0..1023]ofByte;
Size :Integer;
begin
Decoder := ffOpenFile('Video.mpeg', Info);
Packet := ffCreateAVPacket(True);
try
while ffRead(Decoder, Packet, FFDEC_RAW_FRAME_TYPE_ANY)do
begin
if Packet.stream_index= Info.audioStreamIndexthen
begin
if ffDecode(Decoder, Packet,@(Puffer[0]),Length(Puffer), Size)then
// Audiosamples spielen
WriteLn('Audio: ', Size);
endelse
if Packet.stream_index= Info.videoStreamIndexthen
begin
if ffDecode(Decoder, Packet,@(Puffer[0]),Length(Puffer), Size)then
// Zeichnen, Bild ist hier im BGR24-Format
WriteLn('Video: ', Size);
end;
Sleep(100);
end;
finally
ffFreeAVPacket(Packet);
ffClose(Decoder);
end;
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 ?
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
Mitglieder in diesem Forum: 0 Mitglieder und 9 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.