Wie kann ich Gameplay-Material in Unity als Video aufnehmen?

8

Ich baue einen Verkehrssimulator in Unity. Ich muss mein Spiel als Video aufnehmen, damit ich das Video für maschinelles Lernen verwenden kann. Ich habe Fraps für das gleiche verwendet, fand aber nicht, dass es für mich funktioniert, da es nicht in Unity ist. Wie kann ich eine Videoaufnahme des Gameplays machen?

Dg
quelle
1
Was meinst du damit, dass du es nicht "überzeugend" findest?
Doppelgreener
Ich möchte etwas, das das Spielvideo in die Einheit nimmt.
Dg
Ich glaube nicht, dass es einen Weg gibt. Ich benutze dafür GIPHY, aber FRAPS sollte auch in Ordnung sein.
Jesse Williams
Sie können Screenshots von Unity speichern, dies sind jedoch nur Standbilder. Es hat einen großen Einfluss auf Ihre Bildrate, daher ist es für das Erstellen von Filmen nicht wirklich anwendbar, es sei denn, Sie sind bereit, ein "Rendern" durchzuführen (dh die Simulation extrem langsam auszuführen, PNGs zu generieren und sie dann wieder zusammen zu werfen ein Video über Premiere oder einen ähnlichen Video-Editor)
Steve Harding
Ich bin kein Experte für maschinelles Lernen, aber ich bin nur neugierig, warum Sie Bilder verarbeiten müssen, wenn Sie Objekte voller Daten zum Verarbeiten haben.
Candid Moon _Max_

Antworten:

2

Es wird schwierig sein.

Sie müssen eine Bildschirmaufzeichnungssoftware mit einer API finden, damit diese von einer Clientanwendung aktiviert werden kann.

Bandicam ( http://www.bandicam.com/ ) scheint über eine grundlegende API für die Bildschirmaufnahme zu verfügen. Die APIs befinden sich in C / C ++, aber theoretisch können Sie die C-API von einer C # /. NET-Anwendung aus aufrufen.

Auf Ihrem Benutzer muss Bandicam installiert sein, und Sie sind nur auf Windows-Plattformen beschränkt.

Es wäre großartig, ShadowPlay zu aktivieren, oder die anderen vom Hersteller unterstützten Erfassungssysteme verfügen über APIs, aber im Moment sind mir keine bekannt. Sie hätten gedacht, dass die Game Capture-Funktion von Windows 10 ein SDK enthält, aber ich kann keinen Verweis auf eines sehen.

https://www.bandicam.com/company/sdk/bandi_capture_library/help/Chapter3.html

Steve Harding
quelle
0

Ich habe eine etwas vereinfachte Lösung, mit der ich in dieser Frage Videos gemacht habe ....

Zum Aufzeichnen des Bildschirms verwende ich den Iceream-Bildschirmrekorder ( in keiner Weise nur ein zufriedener Benutzer ) Geben Sie hier die Bildbeschreibung ein

Sie können damit einen Abschnitt auf dem Bildschirm auswählen und aufzeichnen. Wenn Sie also manuell arbeiten möchten, ist dies möglicherweise der Fall

Matas Vaitkevicius
quelle
Wie löst man es aus dem Unity-Spiel aus? Meine Kunden interessieren sich für die gleiche Art von Arrangement - sie können die Bildschirmaufnahme im Spiel selbst starten - und es wäre schön, eine Mac-Option zu haben. Aber Sie haben nicht erwähnt, wie es gemacht wird.
Steve Harding
@SteveHarding Hallo Steve. Sie tun es manuell, wählen den Teil des Bildschirms aus und nehmen dann einfach auf ... Wenn Sie Bits haben, in denen Sie zu Beginn des Spiels aufgenommen haben, können Sie es später einfach abschneiden ...
Matas Vaitkevicius
1
Ich habe "es ist nicht in Unity" als "es kann nicht gesteuert werden" verstanden, da FRAPS und seine vielen Freunde - einschließlich der in Windows integrierten Tools, die mit Ihrer Grafikkarte geliefert werden - für Unity-Spiele gut funktionieren. Es kann jedoch sein, dass ich die Frage falsch interpretiert habe.
Steve Harding
0

Sie können dazu die Unity-API verwenden. Keine Notwendigkeit für Dritte. Unity rendert einen Frame selbstständig. Warum benötigen Sie etwas, um ihn erneut zu rendern oder die gerenderte Textur aus dem Speicher außerhalb zu speichern, wenn Sie dies in C # tun können? Richtig, das ist nicht nötig. Aber warum ist das so schwer? Warum kann ich diese Textur nicht einfach nehmen? Ich habe nicht wirklich die richtige Antwort darauf, weil ich kein Experte für GPU bin. Aber soweit ich weiß, löscht die GPU, obwohl sie über Speicher verfügt, sehr oft alles von dort, ich denke, jeder Frame. (Bitte, wenn Sie dieses Thema über GPU viel besser verstehen als ich, erklären Sie es in Kommentaren, ich bin sehr dankbar dafür).

Dieses Unity-Forum widmet sich dieser Frage: Wie kann man richtig auf den gerenderten Tiefenpuffer zugreifen?

Mit Unity kann die Kamera manuell gerendert werden: Camera Render .

Mit etwas Code:

Wenn dies VR ist oder nicht, wäre dieser Thread auf jeden Fall hilfreich und spart viel Zeit bei der Suche nach den Performance-Hits: Echtzeit-Bildaufnahme in Unity .

// Setup a camera, texture and render texture
Camera cam = ...;
Texture2D tex = ...;
RenderTexture rt = ...;

// Render to RenderTexture
cam.targetTexture = rt;
cam.Render();

// Read pixels to texture
RenderTexture.active = rt;
tex.ReadPixels(rectReadPicture, 0, 0);

// Read texture to array
Color[] framebuffer = tex.GetPixels();

Hier ist der Code aus der Unity-Dokumentation zum Speichern von Rendering in PNG.

// We should only read the screen buffer after rendering is complete
yield return new WaitForEndOfFrame();

// Create a texture the size of the screen, RGB24 format
int width = Screen.width;
int height = Screen.height;
Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);

// Read screen contents into the texture
tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
tex.Apply();

// Encode texture into PNG
byte[] bytes = tex.EncodeToPNG();
Object.Destroy(tex);

// For testing purposes, also write to a file in the project folder
File.WriteAllBytes(Application.dataPath + "/../SavedScreen.png", bytes);
Candid Moon _Max_
quelle
Sie geben an, dass Sie dies in der Unity-API tun können, und sagen dann, dass Sie nicht wissen, wie es geht. Sie geben dann Links als Antwort an, wodurch dies (praktisch) eine reine Linkantwort ist. Und selbst wenn die Links erklären, wie Sie auf die Puffertextur zugreifen, erklären Sie nicht, wie Sie daraus ein Video machen oder wie Sie es speichern.
Charanor
@Charanor Ich schrieb, dass ich nicht ganz verstehe, wie GPU funktioniert. Ich habe nicht gesagt, dass ich nicht weiß, wie es geht. Der letzte Link enthält einen offensichtlichen Code, wie es geht. Ich wollte ihn einfach nicht aus der Quelle kopieren und vollständige Informationen bereitstellen. Wenn Sie nicht wissen, wie man aus einer Reihe von Bildern ein Video macht, brauchen Sie das wahrscheinlich nicht - weil es ein zu breites Thema ist, um hier darüber zu sprechen. Gehen Sie einfach und googeln Sie, Sie können Videos nicht in einer Unity formatieren. Wenn Sie solche Fragen stellen, müssen Sie zuerst einige Nachforschungen anstellen, bevor die Leute Ihnen eine vollständige Lösung schreiben.
Candid Moon _Max_
@Charanor Und der letzte, der ein Bild in Unity speichert , docs.unity3d.com/ScriptReference/Texture2D.EncodeToPNG.html , los geht's. Ich habe 5 Sekunden gebraucht, um einen neuen Tab zu öffnen und ihn zu googeln. OP lernt maschinell, ich glaube nicht, dass er ein Videoformat verarbeiten wird, sondern Frames dieses Videos - was es weniger schwierig macht, da er ein Video nicht in Bilder unterteilen muss.
Candid Moon _Max_
Ich würde weiterhin vorschlagen, den relevanten Inhalt Ihrer Links in Ihre Antwort aufzunehmen, da Ihre Antwort die Frage nicht beantwortet, wenn die Links sterben. Daher ist dies eine reine Nur-Link-Antwort.
Charanor
@Charanor Hier, du hast den Code hinzugefügt :) Du hast einen guten Punkt gemacht, danke für die Antwort.
Candid Moon _Max_