Ich möchte gerne meine Animationen in Echtzeit so gut wie möglich aufnehmen, ohne viel zu komprimieren und ohne viel Preformanceverlust.
Weiß jemand vielleicht, ob man irgendiwie den Output der Grafikkarte splitten kann, also so, dass man genau das was man sieht eben auch aufnehmen kann, ohne den Rechner, auf dem gerendert wird, damit zu behelligen? Falls ja, was brauch ich dazu?
Und falls nein, was gibt es für Möglichkeiten? Bin momentan an OpenGL gebunden. Würde halt am Liebsten in 4K und 60 Hz aufnehmen. Und selbst ne richtig flotte SSD schafft das unkomprimiert nicht. Und diverse Lets Player machen ja sowas auch, also dachte ich mir, dass es gehen müsste. Oder komprimieren die den Stream? Komprimieren is ja bei der Menge auch nicht gerade performancefreundlich, oder?
Grüße, Vinz
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Also ohne jegliche Kompression macht das glaube ich niemand. Da es mittlerweile Spezialchips gibt, die H.264-Encoding in Hardware erledigen, ist das auch nicht unbedingt nötig. Jede moderne GPU (auch die integrierten) haben einen solchen Chip mit an Bord. Du brauchst nur eine Software, die ihn auch nutzt. Ich glaube Fraps kann das nicht. Wenn du nicht den selben Rechner aufnehmen lassen willst, der auch das Bild berechnet, kannst du dir auch eine von diesen HDMI-capture-Boxen holen. Zum Beispiel elgato Game Capture.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2067
Programmiersprache: C++
Was für ein OS nutzt du denn? Bei Windows gibt es Videosinks welchen du Einzelbilder gibst und dann z.B. MP4 herauskommt. Und das funktioniert mit OpenGL.
Also ohne jegliche Kompression macht das glaube ich niemand. Da es mittlerweile Spezialchips gibt, die H.264-Encoding in Hardware erledigen, ist das auch nicht unbedingt nötig. Jede moderne GPU (auch die integrierten) haben einen solchen Chip mit an Bord. Du brauchst nur eine Software, die ihn auch nutzt. Ich glaube Fraps kann das nicht. Wenn du nicht den selben Rechner aufnehmen lassen willst, der auch das Bild berechnet, kannst du dir auch eine von diesen HDMI-capture-Boxen holen. Zum Beispiel elgato Game Capture.
Dieses Elegato ist eigentlich so was, was ich suche, aber es geht nur bis 1080p. Weißt Du, ob man da die Daten auch RAW abspeichern kann, oder ob man nur komprimierten Output bekommt. Hätte da gerne volle Kontrolle, was ich z.B. bei Aufnahmeprogrammen misse, ist die Möglichkeit, nur aufzunehmen, wenn ein neues Frame berechnet wurde, sieht nämlich unschön aus, wenn die Framerate mal einbricht und das mitaufgenommen wird.
Wie kann man den H.264-Encoding-Chip ansprechen?
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Zuletzt geändert von Vinz am Fr Jul 22, 2016 17:06, insgesamt 1-mal geändert.
Was für ein OS nutzt du denn? Bei Windows gibt es Videosinks welchen du Einzelbilder gibst und dann z.B. MP4 herauskommt. Und das funktioniert mit OpenGL.
Ist dieses Videosinks denn performant? Eigentlich hole ich momentan über OpenGl via PBO die Frames, das geht an sich sehr schnell.
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2067
Programmiersprache: C++
Für mich war es performant genug. Bei mir war die Bremse an anderer Stelle und es war schnell genug das ich mich nicht darum gekümmert habe. Das musst du selber testen. Und ja, PBOs waren bei mir das Mittel.
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Vinz hat geschrieben:
Weißt Du, ob man da die Daten auch RAW abspeichern kann, oder ob man nur komprimierten Output bekommt.
Ich besitze so ein Gerät nicht, aber RAW-Output kann ich mir schwer vorstellen. Bei 4k und 60 fps wären das ja 1,5 GB/s. Welcher Datenträger ist so schnell? Abgesehen davon wäre selbst eine Terabyte-Festplatte nach gut zehn Minuten voll.
Vinz hat geschrieben:
Hätte da gerne volle Kontrolle, was ich z.B. bei Aufnahmeprogrammen misse, ist die Möglichkeit, nur aufzunehmen, wenn ein neues Frame berechnet wurde, sieht nämlich unschön aus, wenn die Framerate mal einbricht und das mitaufgenommen wird.
Wenn die Framerate einbricht, sieht es in jedem Fall doof aus. Auch wenn die Videodatei so geschrieben wird, als wenn jeder Frame 16,67 ms gedauert hätte, denn dann hättest du Geschwindigkeitssprünge in der Wiedergabe. Einziger Ausweg wäre meiner Meinung nach, auf timebased Movement zu verzichten und die Zeit stattdessen jeden Frame um einen konstanten Wert zu erhöhen. Dann müsstest du jedes gerenderte Bild aufzeichnen (z.B. als verlustfreies PNG) und daraus im Nachhinein ein Video machen. Habe ich dich richtig verstanden, dass es dein eigenes Programm ist, das du aufzeichnen willst? Also mit deinem Quellcode?
Vinz hat geschrieben:
Wie kann man den H.264-Encoding-Chip ansprechen?
Da gibt es verschiedene APIs. Auf Windows kenne ich mich nicht aus. Unter Linux gibt es VA-API, VDPAU und OpenMAX, jedoch wird keine dieser APIs von allen Grafiktreibern ordentlich unterstützt. Du müsstest dich also entweder an eine bestimmte Hardware binden oder Unterstützung für mehrere APIs implementieren - also genau das machen, was man durch die Nutzung einer Standard-API vermeiden will. https://xkcd.com/927/ Die Hardware-Encoder sind auch nicht alle gleich gut. In c't wurden die mal getestet, wobei einzig der von Intel brauchbare Qualität lieferte.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Weißt Du, ob man da die Daten auch RAW abspeichern kann, oder ob man nur komprimierten Output bekommt.
Ich besitze so ein Gerät nicht, aber RAW-Output kann ich mir schwer vorstellen. Bei 4k und 60 fps wären das ja 1,5 GB/s. Welcher Datenträger ist so schnell? Abgesehen davon wäre selbst eine Terabyte-Festplatte nach gut zehn Minuten voll.
Vinz hat geschrieben:
Hätte da gerne volle Kontrolle, was ich z.B. bei Aufnahmeprogrammen misse, ist die Möglichkeit, nur aufzunehmen, wenn ein neues Frame berechnet wurde, sieht nämlich unschön aus, wenn die Framerate mal einbricht und das mitaufgenommen wird.
Wenn die Framerate einbricht, sieht es in jedem Fall doof aus. Auch wenn die Videodatei so geschrieben wird, als wenn jeder Frame 16,67 ms gedauert hätte, denn dann hättest du Geschwindigkeitssprünge in der Wiedergabe. Einziger Ausweg wäre meiner Meinung nach, auf timebased Movement zu verzichten und die Zeit stattdessen jeden Frame um einen konstanten Wert zu erhöhen. Dann müsstest du jedes gerenderte Bild aufzeichnen (z.B. als verlustfreies PNG) und daraus im Nachhinein ein Video machen. Habe ich dich richtig verstanden, dass es dein eigenes Programm ist, das du aufzeichnen willst? Also mit deinem Quellcode?
Vinz hat geschrieben:
Wie kann man den H.264-Encoding-Chip ansprechen?
Da gibt es verschiedene APIs. Auf Windows kenne ich mich nicht aus. Unter Linux gibt es VA-API, VDPAU und OpenMAX, jedoch wird keine dieser APIs von allen Grafiktreibern ordentlich unterstützt. Du müsstest dich also entweder an eine bestimmte Hardware binden oder Unterstützung für mehrere APIs implementieren - also genau das machen, was man durch die Nutzung einer Standard-API vermeiden will. https://xkcd.com/927/ Die Hardware-Encoder sind auch nicht alle gleich gut. In c't wurden die mal getestet, wobei einzig der von Intel brauchbare Qualität lieferte.
Ja, das stimmt, 60 Hz 4K packt keine SSD. Wenn ich auf 48 Hz gehe und vorher auf YUV schreibe würde es gehen und ich hätte effektiv keine Kompression, weil die ganzen Videoformate auf den Videoplattformen eh YUV haben. Ja, es ist meine eigene Anwendung und da könnte ich die Bewegungen natürlich komplett Frameweise berechnen, aber dann müsste ich die Soundaufnahme auch selber schreiben, ist aber eig kein Problem... Das mit dem Encoding ist glaub ich n Problem, das wirklich gut zu machen, weil man ja für gutes Encoding eig. viel Zeit braucht, oder? Oder ist es möglich, relativ schnell ein Encoding auf eine relativ hohe Qualität hinzubekommen?
Weiß jemand zufällig, wie man sich dieses Encoding, speziell jetzt das Encoding auf der GPU vorstellen kann? Wäre natürlich schon optimal, wenn die Grafikkarte irgendwas mit den Frames macht, und dann überhaupt erst viel weniger Daten von der GPU geholt werden müssen. Intelprozessor habe ich, aber wenn das Zeug auf ner AMD oder NVIDIA gerendert wird und ich dann das ganze doch über den Prozessor laufen lassen muss, ist es ja auch nicht optimal, gibts da von AMD und NVIDIA auch ne API? Selber schreiben in OpenGL z.B. ist wohl eher etwas zu aufwändig...
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Zumindest NVIDIA hat für geanu den Anwendungsfall ShadowPlay. Benutze ich u.a. um Videos von meinen Vulkan-Anwendungen zu machen, und es kostet trotz schwer CPU und normaler HD kaum Leistung. Hab bisher zwar nur max. 2560x1440@60fps aufgenommen, aber 4K ist auch möglich.
Wenn die Videoqualität bei dir oberste Priorität hat, führt übrigens kein Weg an Software-Encoding vorbei. x264 ist hier weiterhin ungeschlagen und insbesondere allen Hardware-Encodern überlegen.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Dieses Api-Trace ist ja mal ein ganz anderer Ansatz. Speichert das dann alles was auf der GPU ist in diese trace file, also auch Texturen, etc.? Oder wie kann ich mir das vorstellen?
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Apitrace zeichnet ganz einfach alle gl*-Aufrufe auf, die dein Programm macht. Inklusive aller Parameter. D.h., wenn du glTexImage2D aufrufst, landen auch die Texturdaten im trace-File. Das Trace-File kannst du hinterher auf jedem Rechner, der die nötigen OpenGL-Features unterstützt, wieder abspielen. Dabei kannst du den Kontext in den Debug-Modus stellen um Fehler zu entdecken, Performance analysieren, Treiber vergleichen oder was auch immer. Oder du leitest halt die Ausgabe an ffmpeg weiter.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Den Sound synchron zu bekommen stelle ich mir schwierig vor. Wenn die Framerate des Zielobjektes über die Aufnahme hinweg schwankt, wird Apitrace das nicht abbilden; Apitrace rendert so schnell es kann.
viele Grüße, Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
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.