Wie man den Bildschirm so schnell wie möglich über adb aufnimmt?

Vor kurzem habe ich einen PC-Client geschrieben, der meinen Android-Bildschirm in Echtzeit anzeigen und steuern kann. Ich benutze den Affen, um das Gerät zu kontrollieren und es funktioniert gut. Das Problem ist, wie man den Handy-Bildschirm zu greifen und zeigt es reibungslos.

Die erste Lösung, mit der ich gekommen bin, ist, den framebuffer durch adb (wie die DDMS-Screen Capture-Funktion) kontinuierlich zu packen. Jetzt, wenn ich es tue, ist die Aufführung ganz inakzeptabel. Die von framebuffer erfasste Bildrate ist so niedrig wie 5 pro Sekunde (die Baugröße beträgt 800 * 480). Mein Programm sieht aus wie sein Schluckauf, wenn ich auf dem Telefon rutsche.

  • Benutzerdefinierte Benutzer der Benutzeroberfläche
  • So richten Sie ADB für die Remote-Maschinenentwicklung und die Bereitstellung lokaler Geräte ein
  • Android-Gerät hält die Verbindung von Adb / Eclipse
  • Wie man Android's aapt und adb Arbeit auf 64-Bit-Ubuntu ohne ia32-libs (Werke für die Versionen 12, 13 und 14)
  • So verwenden Sie ADB in Android Studio, um eine SQLite DB anzuzeigen
  • Wie benutzt man `adb`, um Entwicklungs-Apps nur für einen Benutzer zu installieren?
  • Mein Programm ist in Java mit ddmslib , um framebuffer zu greifen.

    hinzufügen:
    Ich fand es sehr langsam, die Roh- framebuffer Daten in das .png Format zu codieren, sonst wird dies eine schnelle Möglichkeit sein, ein komprimiertes Rohbild zu übertragen.

    Wie kann ich die Geschwindigkeit der Erfassung des Bildschirms auf ein reibungsloses Niveau verbessern?

  • Befolgen Sie den Benutzerstandort auf React Native AirBnb's MapView
  • Open Source Image Filter Bibliothek wie Instagram?
  • Android Studio: Kann nicht auf Shared Preferences in instrumentierten Test schreiben
  • Wie man Doppel- und Float-Werte in sqlite einfügt?
  • Vorschläge für den Aufbau eines Treeview-Steuerelements in Android
  • Wie man ein Layout erstellt, das schräg gespalten ist und die beiden Hälften anklickbar sind?
  • 12 Solutions collect form web for “Wie man den Bildschirm so schnell wie möglich über adb aufnimmt?”

     adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen.png 

    Quelle:

    http://blog.shvetsov.com/2013/02/grab-android-screenshot-to-computer-via.html

    Sie könnten verwenden:

    $ Adb shell screencap -p> sc.png

    Was leider nicht funktioniert (Datei ist beschädigt), also ist deine Option übrig

     $ adb shell screencap -p /mnt/sdcard/sc.png $ adb pull /mnt/sdcard/sc.png 

    Während dies relativ schnell ist, ist es wahrscheinlich nicht so schnell wie du brauchst

    Wenn der langsame Teil ist roh zu png Umwandlung ( time adb shell screencap -p /sdcard/x.png ist deutlich langsamer als time adb shell screencap /sdcard/nonpng.raw , wie ich es in Spielen haben) und png ist nicht notwendig, Dann kannst du dich hier gerne machen. https://github.com/sowcow/shot . Es konvertiert Rohdaten in ein einfaches ppm-Format und konvertiert ppm zu bmp mit imagemagick mit fast kein Overhead, nachdem es Rohdaten bekommt

    Upd:

    Dieses Shell-Skript von max_plenert ist ein besseres Beispiel:

     adb shell screencap /sdcard/mytmp/rock.raw adb pull /sdcard/mytmp/rock.raw adb shell rm /sdcard/mytmp/rock.raw // remove the header tail -c +13 rock.raw > rock.rgba // extract width height and pixelformat: hexdump -e '/4 "%d"' -s 0 -n 4 rock.raw hexdump -e '/4 "%d"' -s 4 -n 4 rock.raw hexdump -e '/4 "%d"' -s 8 -n 4 rock.raw convert -size 480x800 -depth 8 rock.rgba rock.png 

    In .bash_profile auf meinem Mac:

     function droidShot() { /full_path_to_droid_sdk/platform-tools/adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > $1.png } 

    Verwendung:

     droidshot whatever 

    Und die Datei erscheint in was auch immer.png

    Mit dieser Methode, meine App weiter zu laufen, ist es voller Framerate

     adb pull /dev/graphics/fb0 

    Dadurch werden die Rohdaten aus dem Rahmenpuffer heruntergezogen. Es scheint die gleiche Breite wie der Bildschirm zu sein, aber die Höhe ist ausgefüllt. Der Frame-Puffer auf meinem Gerät scheint im RGBA8888-Format zu sein. Um genau zu bekommen, was auf dem Bildschirm angezeigt wird, sollten Sie den Alphakanal ignorieren.

    Beachten Sie, dass dies ~ 0,8 Sekunden dauert, um für mich herunterzuladen (Resoultion: 480×854), aber wenn ich das Herunterladen auf einer Endlosschleife habe, hat dies keinen Einfluss auf die Bildrate des Geräts.

    Dies ist eine langsame Lösung, ich bin sicher, es ist die schnellere Art und Weise finden Sie in Adb-basierte Lösungen,

     # this line require a superuser privilege: adb shell "su -c 'cat /dev/graphics/fb0 > /sdcard/capture.raw'" adb pull /sdcard/capture.raw ffmpeg -loglevel panic -f rawvideo -pix_fmt bgr32 -s 320x480 -i \ capture.raw -vcodec png -vframes 1 capture.png; 

    Dies ist der gleiche Code in meine Web-Anwendung

    Von docs :

    Einen Geräte-Screenshot machen

    Der Screencap-Befehl ist ein Shell-Dienstprogramm für die Aufnahme eines Screenshots eines Geräte-Displays. Während in einer Shell ist die Syntax:

     screencap <filename> 

    Um die screencap von der Befehlszeile zu verwenden, geben Sie Folgendes ein:

     $ adb shell screencap /sdcard/screen.png 

    Hier ist eine Beispiel-Screenshot-Session, mit der Adb-Shell, um den Screenshot und den Pull-Befehl zu erfassen, um die Datei vom Gerät herunterzuladen:

     $ adb shell shell@ $ screencap /sdcard/screen.png shell@ $ exit $ adb pull /sdcard/screen.png 

    Aufnehmen eines Gerätebildschirms

    Der Screenrecord-Befehl ist ein Shell-Dienstprogramm für die Aufnahme der Anzeige von Geräten mit Android 4.4 (API Level 19) und höher. Das Dienstprogramm zeichnet die Bildschirmaktivität auf eine MPEG-4-Datei auf.

     Note: Audio is not recorded with the video file. 

    Ein Entwickler kann diese Datei verwenden, um Werbe- oder Trainingsvideos zu erstellen. Während in einer Shell ist die Syntax:

     screenrecord [options] <filename> 

    Um den Screenrecord über die Befehlszeile zu verwenden, geben Sie Folgendes ein:

     $ adb shell screenrecord /sdcard/demo.mp4 

    Stoppen Sie die Aufnahme durch Drücken von Strg-C, andernfalls stoppt die Aufnahme automatisch um drei Minuten oder die von – time-limit eingestellte Zeitgrenze .

    Um die Aufnahme des Gerätes zu starten, führen Sie den Befehl screenrecord aus, um das Video aufzunehmen. Dann führen Sie den Pull-Befehl, um das Video vom Gerät zum Host-Computer herunterzuladen. Hier ist eine Beispielaufnahme:

     $ adb shell shell@ $ screenrecord --verbose /sdcard/demo.mp4 (press Ctrl-C to stop) shell@ $ exit $ adb pull /sdcard/demo.mp4 

    Das Screenrecord-Dienstprogramm kann bei jeder unterstützten Auflösung und Bitrate, die Sie anfordern, unter Beibehaltung des Seitenverhältnisses der Geräteanzeige aufzeichnen. Das Dienstprogramm zeichnet bei der nativen Bildschirmauflösung und Ausrichtung standardmäßig mit einer maximalen Länge von drei Minuten auf.

    Es gibt einige bekannte Einschränkungen des Screenrecord-Dienstprogramms, die Sie bei der Verwendung beachten sollten:

    Einige Geräte sind möglicherweise nicht in der Lage, auf ihrer nativen Bildschirmauflösung aufzuzeichnen. Wenn Sie Probleme mit der Bildschirmaufzeichnung haben, versuchen Sie es mit einer niedrigeren Bildschirmauflösung. Die Rotation des Bildschirms während der Aufnahme wird nicht unterstützt. Wenn sich der Bildschirm während der Aufnahme dreht, wird ein Teil des Bildschirms in der Aufnahme abgeschnitten.

    Ich habe mich auf @ stevehas Lösung verbessert:

    Erstellen Sie ein Shell-Skript sagen: ' android-screenshot ' mit folgendem Inhalt:

     adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen-`date +%Y-%m-%d_%X`.png 

    Legen Sie diese Datei in Ihr lokales Bin-Verzeichnis oder ein anderes $ PATH, das Sie bevorzugen.

    Damit können Sie die Dateien mit einem Zeitstempel im aktuellen Verzeichnis speichern.

    Denken Sie daran, das Shell-Skript ausführbar zu machen

     chmod +x android-screenshot 

    Nun, einige Leute sagten in Perl gibt es viele Möglichkeiten, eine Sache zu tun. 🙂 Jedenfalls kann dies besser ausführen (da es keinen regulären Ausdruck gibt) und kann das Problem in Cygwin in MS Windows (dessen Perl definieren \n als CRLF) lösen:

     adb shell screencap -p | perl -pe 'BEGIN { $/="\cM\cJ"; $\="\cJ"; } chomp;' > screen-$(date +%Y%m%d_%H%M%S).png 

    Es gibt ein screenrecord Programm ab Android 4.4

     adb shell screenrecord /data/local/tmp/test-video.m4v adb pull /data/local/tmp/test-video.m4v ~/test-video.m4v 

    Adb shell screenrecord –bit-rate 8000000 – time-limit 30 /sdcard/example.mp4

    Sie können die Bitrate ändern und die Videodauer auch ändern.

     adb shell screencap /sdcard/screen.png && adb pull /sdcard/screen.png my_screen01.png 
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.