2011-01-11 4 views
8

So erfassen Sie den Bildschirminhalt des Android-Geräts mithilfe von /dev/graphics/fb0 und wie Sie eine Bilddatei mit den gesammelten Daten aus dem Bildpuffer erstellen. Ich weiß dafür, dass das Gerät gerootet werden muss und ich bin damit einverstanden.So erfassen Sie den Bildschirm mit/dev/graphics/fb0 (Android)

Vielen Dank im Voraus,

Antwort

9

Diese Arbeit sollte:

adb pull /dev/graphics/fb0 fb0 
ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 320x480 -i fb0 -f image2 -vcodec png image.png 
+0

Wo speichert es? – XXX

+1

Arbeitete gut für mich, keine Notwendigkeit -vframes hinzuzufügen 1 –

+0

Ich bekomme das als Fehler: [image2 @ 0x2405c40] Konnte Bild Dateiname Nummer 2 aus Muster 'image.png' nicht erhalten (entweder updatefirst oder ein Muster wie % 03d innerhalb des Dateinamens) av_interleaved_write_frame(): Ungültiges Argument – Santhanam

3

Wenn Sie die root-Berechtigung haben.

  1. kopieren Sie Daten von fb0 in eine andere Datei, z.

    cat fb0 > tmp 
    
  2. An dieser Stelle können Sie die neue Datei immer noch nicht öffnen. , da die Datenstruktur der Datei kein Bilddateiformat erfüllen kann. Also was Sie brauchen, ist es zu entschlüsseln. In dieser Datei beschreiben alle zwei Bytes ein Pixel. die höheren 5 Bisse repräsentieren die rote Farbe, die unteren 5bites repräsentieren die blaue Farbe und die restlichen mittleren 6 Bisse sind grün. Sie können die obigen Informationen verwenden, um eine BMP und jede andere sichtbare Datei zu erstellen.

+0

das erwarten wir von einem echten Programmierer :) – christian

4

Nebkat Lösung funktioniert manchmal, aber auf dem Klecks Testwerkzeug in der Arbeit habe ich gelernt, dass es für sie ein Bild direkt von fb0 keine universelle Art und Weise ist. Das Motorola Droid 2 verwendet RGB 32. Das Huawei Ascend verwendet RGB 565. Das Samsung Captivate verwendet keines und scheint nicht den gesamten Bildschirm in den Puffer zu stellen.

+0

Alles, was Sie tun müssen, ist rgb32 zu ändern, was auch immer Sie verwenden. – nebkat

+0

Ja, die Notwendigkeit, die Kodierung und die Dimensionen zu ändern, wird für die meisten Leser offensichtlich sein, nachdem ich darauf hingewiesen habe, dass nicht alle Geräte dieselbe Kodierung haben. Der FFmpeg-Ansatz funktioniert jedoch nicht mit Captivate und ähnlichen. –

+0

Danke! Der Jellybean (Android 4.2) Emulator verwendet rgb565. – BVB

1

Sie könnten -pix_fmt rgb32 durch -pix_fmt rgb565le für 16-Bit-Geräte ersetzen.

1

Wenn Sie nicht sicher über das Format des Geräts Frame-Buffer sind, können Sie ffmpeg unterstützten Formate laufen wie folgt:

for fmt in $(ffmpeg -pix_fmts|cut -d " " -f 2); do ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt $fmt -s 320x480 -i fb0 -f image2 -vcodec png /tmp/image-$fmt.png; done 

Die Ergebnisse Thumbnails sind auch Art künstlerischer.