2012-12-11 2 views
8

Nach vielen Suchen und Tagen der Experimente habe ich keine einfache Lösung gefunden.In-App-Bildschirm Aufnahme auf Android 15 Bilder pro Sekunde zu erfassen

Ich entwickle eine App, die Benutzer mit einem Haustier auf dem Bildschirm interagieren und ich möchte ihn als Video speichern lassen.

Gibt es eine "einfache" Möglichkeit, den Bildschirm der App selbst zu erfassen?

Ich habe einen Workaround gefunden (um Bitmaps jede Sekunde zu speichern und dann an einen Encoder zu übergeben), aber es scheint zu schwer. Ich werde glücklich, auch mit einer Framerate von 15 Bildern pro Sekunde

Es scheint möglich zu sein, dh es ist eine ähnliche Anwendung, die dies tut, sein namens „Talking Tom“

+4

Haben Sie den Bildschirm tatsächlich haben aufzeichnen hilft?Oder können Sie ein Video basierend auf der Aufnahme des Benutzer-/Haustierstatus rendern, die genau wie der Bildschirm aussieht, ohne tatsächlich eine Bildschirmaufnahme zu sein? –

+2

"Gibt es eine" einfache "Möglichkeit, den Bildschirm der App selbst zu erfassen?" - Warum würdest du das machen, anstatt eine Bitmap direkt vom gewünschten Inhalt zu erstellen? Wenn Sie ein Bild in einem Bildbearbeitungsprogramm wie Photoshop speichern, glauben Sie, dass die App einen Screenshot erstellt und speichert? – CommonsWare

+1

Verwenden Sie OpenGL, um Ihr Haustier zu rendern? Sie können 'glReadPixels()' nach jedem Frame verwenden, um die Daten zu erfassen und dann mit dem zu tun, was Sie wollen. Ja, dieser Vorschlag entspricht im Wesentlichen dem von Ihnen erwähnten "Workaround". Ich glaube nicht, dass es ein magisches 'recordScreenToVideoFile()' in Android integriert gibt, also ist das Ergreifen von Frames und deren Kodierung wahrscheinlich das Beste, was Sie bekommen werden. –

Antwort

1

Es ist wirklich auf dem Weg ab, die Sie Ihren „pet implementieren Aussicht". Zeichnest du auf einem Canvas? OpenGL ES? Normale Android-Ansichtshierarchie?

Wie auch immer, es gibt keine magische "recordScreenToVideo()" wie einer der Kommentare sagte.

Sie müssen:

  • Bitmaps Sichern Sie sich "Frames" darstellen. Dies hängt davon ab, wie Sie Ihre Ansicht implementieren. Wenn Sie sich selbst zeichnen (Canvas oder OpenGL), speichern Sie Ihre Rohpixelpuffer als Rahmen. Wenn Sie die normale Ansichtshierarchie verwenden, können Sie Androids onDraw von der Unterklasse ableiten und die "Frames" speichern, die Sie auf der Leinwand erhalten. Die Häufigkeit des Systemaufrufs an onDraw ist nicht weniger als die tatsächliche "Bildfrequenz" des Bildschirms. Falls erforderlich, duplizieren Sie anschließend Frames, um ein 15fps-Video zu liefern.

  • Kodieren Sie Ihre Bilder. Scheint so, als hättest du bereits einen Mechanismus dafür, du brauchst ihn nur, um effizienter zu sein.

Wege können Sie Codierung optimieren:

  • Cache Ihre Bitmaps (Frames) und kodieren danach. Dies funktioniert nur, wenn Ihr erwartetes Video relativ kurz sein wird, sonst werden Sie aus dem Speicher bekommen.
  • Nehmen Sie nur mit der Framerate auf, die Ihre App tatsächlich erzeugt (abhängig von der Art, wie Sie zeichnen) und verwenden Sie einen Encoder-Parameter, um ein 15fps-Video zu erzeugen (ohne 15 Bilder pro Sekunde zu liefern).
  • Passen Sie die Qualitätseinstellungen an das aktuelle Gerät an. Dies kann durch Ausführen eines verborgenen CPU-Zyklustests beim App-Start und durch die Definition einiger Schwellenwerte erfolgen.
  • Kodieren Sie nur den relevantesten Teil des Bildschirms.
  • Wieder, wirklich abhängig von der Art, wie Sie implementieren - wenn Sie einige "History-Daten" speichern und dann in Frames konvertieren, ohne es in Echtzeit zu tun, wäre das das Beste. Zum Beispiel "bewegen", "lächeln", "Farbe ändern" - oder was auch immer Ihre Geschäftslogik ist, da Sie nicht näher darauf eingegangen sind. Ihre "Film generieren" -Funktion wird diese Verlaufsdaten als Bildsequenz animieren (ohne auf den Bildschirm zu zeichnen) und dann kodieren.

Hoffnung, die

Verwandte Themen