AugustQ
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi, ich möchte die Aktivitäten vom Bildschirm aufnehmen (genauer: von Firefox). Könnt Ihr mir dafür ein Programm empfehlen? Gefunden habe ich den simplescreenrecorder. Aber ich möchte nur 1 Bild pro Minute aufnehmen, das ergibt bei 24 Stunden einen Film von 1 Minute Dauer, und das reicht mir. Kann man dies innerhalb dieses Programms einstellen? Oder könnt Ihr mir ein anderes Programm empfehlen? Schönen Gruß
AugustQ
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Bei einem Bild pro Minute reicht es eigentlich Screenshots zu machen, die man dann z.B. mit ffmpeg in ein Filmchen überführt. Man könnte z.B. mit wmctrl die Window-ID von firefox ermitteln lassen und mit xwd Screenshots machen lassen. Das folgende Skript läuft in einer Endlosschleife und schreibt alle 1440 Durchläufe (und beim Beenden des Skipts) ein Filmchen raus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | #!/bin/bash
rm *.xwd
counter=0
create_movie() {
ffmpeg -framerate 24 -i screenshot_%05d.xwd output_$(date +"%y-%m-%d_%H:%M:%S").mp4
rm *.xwd
exit
}
trap create_movie INT EXIT
while :
do
ff_window_id=$(wmctrl -l | awk '/Mozilla Firefox/ {print $1}')
if [ -n "$ff_window_id" ]
then
xwd -id "$ff_window_id" -out $(printf "screenshot_%05d.xwd" $counter)
else
echo "$(date) no firefox instance found"
fi
(( counter++ ))
if [ $counter -eq 1440 ]
then
create_movie
counter=0
fi
sleep 60
done
|
Edit: Falls es mehr als ein Firefox-Fenster geben kann, muss man das natürlich im Skript berücksichtigen.
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi, oh, das muß ich mal ausprobieren. Danke.
Ich melde mich dann wieder. Schönen Gruß
AugustQ
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi seahawk, Danke für das Skript. Ich habe das jetzt endlich mal ausprobiert. Im zweiten Teil erhalte ich allerdings diese Fehlermeldungen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | august@August-Ryzen:~/Temp/Filmchen$ ffmpeg -framerate 24 -i screenshot_%05d.xwd output_$(date +"%y-%m-%d_%H:%M:%S").mp4
libGL error: unable to load driver: radeonsi_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: radeonsi
libGL error: unable to load driver: radeonsi_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: radeonsi
libGL error: unable to load driver: swrast_dri.so
libGL error: failed to load driver: swrast
X Error: GLXBadContext
Request Major code 155 (GLX)
Request Minor code 6 ()
Error Serial #55
Current Serial #54
ffmpeg version n4.0.2 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
configuration: --prefix= --prefix=/usr --disable-debug --disable-doc --disable-static --enable-avisynth --enable-cuda --enable-cuvid --enable-libdrm --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libv4l2 --enable-libvorbis --enable-libx264 --enable-libx265 --enable-libxcb --enable-nonfree --enable-nvenc --enable-omx --enable-runtime-cpudetect --enable-shared --enable-vaapi --enable-vdpau --enable-version3 --enable-xlib
libavutil 56. 14.100 / 56. 14.100
libavcodec 58. 18.100 / 58. 18.100
libavformat 58. 12.100 / 58. 12.100
libavdevice 58. 3.100 / 58. 3.100
libavfilter 7. 16.100 / 7. 16.100
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
libpostproc 55. 1.100 / 55. 1.100
[image2 @ 0x18f2480] Could find no file with path 'screenshot_%05d.xwd' and index in the range 0-4
screenshot_%05d.xwd: No such file or directory
august@August-Ryzen:~/Temp/Filmchen$
|
Im ersten Teil der Meldung fehlt wohl irgendwas. Und im zweiten Teil findet er die Dateien mit der Endung xwd nicht (die sind mittlerweile verschwunden, aber da muß ich erst noch einmal nachschauen). Angesehen habe ich mir das Skript:
mit dem sleep() wird erreicht, daß nach 60 Sekunden eine neue Aufnahme gemacht wird xwd macht die Aufnahme vom Firefox-Window, was auch trotz Firefox im Hintergrund bzw. aktivem Bildschirmschoner funktioniert (schön!) wmctrl bestimmt die Id des Firefox-Windows bei Abbruch des Skripts bzw. mehr als 1440 Bilder beginnt die Erzeugung des Films ah, gesehen: am Ende der Wandlung werden die xwd-Dateien gelöscht → werd ich rausnehmen
Aufgefallen ist mir, daß jede Datei ca. 7.6 MB gross ist. Wie gross wird denn da der Film? Schönen Gruß
AugustQ
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
AugustQ schrieb: Dann musst dann nur aufpassen, dass bei der Konvertierung Müll entstehen kann, wenn es beim Konvertieren noch alte Restbilder gibt. Aufgefallen ist mir, daß jede Datei ca. 7.6 MB gross ist. Wie gross wird denn da der Film?
Auf jeden Fall spürbar kleiner als die addierte Größe der Einzelbilder - das xwd-Format ist unkomprimiert (die Dateien sind größer als Bitmaps). Wenn du Sorgen wegen dem Platzbedarf hast, kannst du die Bilder auch noch in ein komprimiertes Format umwandeln (z.B. mit Imagemagick (Abschnitt „convert“)) - für die beste Videoqualität würde ich aber bis zum abschließenden Encoding warten, bevor man Bildinformationen verwirft. H.264 ist ein ziemlich effizienter Codec, der einige Tricks kennt, um ein visuell akzeptables Ergebnis bei deutlich weniger Platzbedarf zu erzielen. In Abhängigkeit von der gewünschten Video-Qualität kannst du auch noch an den Encoding-Einstellungen von ffmpeg drehen: https://trac.ffmpeg.org/wiki/Encode/H.264
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi, Kommando zurück ! Ich habe noch einmal die Aufnahmen gestartet. Dabei kamen zwar nur ca. 150 Bilder heraus, da ich dies nur über die verlängerte Mittagspause laufen lies, aber im Ergebnis lief die Konvertierung durch und es entstand ein Film der Größe ca. 400KB. Das wäre somit alles OK. Ich verfolge das noch einmal und melde mich dann wieder. Schöne Grüße
AugustQ
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi, mittlerweile habe ich ein wenig experimentiert. Dies ist mein aktuelles Skript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | #!/bin/bash
rm *.xwd
counter=0
# create_movie() {
# ffmpeg -framerate 24 -i screenshot_%05d.xwd output_$(date +"%y-%m-%d_%H:%M:%S").mp4
# rm *.xwd
# exit
# }
# trap create_movie INT EXIT
while :
do
ff_window_id=$(wmctrl -l | awk '/Mozilla Firefox/ {print $1}')
if [ -n "$ff_window_id" ]
then
xwd -id "$ff_window_id" -out $(printf "screenshot_%05d.xwd" $counter)
xdotool key --window $ff_window_id "ctrl+F5"
else
echo "$(date) no firefox instance found"
fi
(( counter++ ))
# if [ $counter -eq 1440 ]
# then
# create_movie
# counter=0
# fi
sleep 60
done
|
Das läuft, sowohl auf meinem PC hier unter Ubuntu mit Firefox als auch auf meinem RasPi mit Chrome (nach Anpassung einer Zeile). Einige Anmerkungen dazu: Ich werde weiter experimentieren. Schönen Gruß
AugustQ
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
1: das Kommando xwd nimmt den aktuellen Bildschirm auf. Eigentlich (so hatte ich das verstanden) soll der Teil des Kommandos -id "$ff_window_id" ein Bild vom Firefox-Bildschirm aufnehmen. Ist da was faul? 2: Aufnehmen will ich die Seite Luftdaten.info. Ich dachte, daß diese Seite sich selbsttätig aktualisieren würde, aber das tut sie nicht. Also habe ich mal das Kommando Ctrl+F5 eingebaut. In den letzten Tagen was die Seite reichlich träge. so daß ich "Kacheln" im Bild habe. Und ich hatte timeouts, die auch getreulich aufgenommen wurden.... (das kann aber auch an meiner Verbindung hier liegen, also der Verbindung von PC zum Router. ds waren meine Anmerkungen, die irgendwie verloren gegangen sind.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
AugustQ schrieb:
1: das Kommando xwd nimmt den aktuellen Bildschirm auf. Eigentlich (so hatte ich das verstanden) soll der Teil des Kommandos -id "$ff_window_id" ein Bild vom Firefox-Bildschirm aufnehmen. Ist da was faul?
Ich würde mir ansehen, ob die Zeile 13 das gewünschte Ergebnis liefert. Bei Debian-Versionen vor Stretch könnte der Firefox noch Icewasel heißen. Bei Chrome/Chromium muss das ebenfalls angepasst werden. 2: Aufnehmen will ich die Seite Luftdaten.info. Ich dachte, daß diese Seite sich selbsttätig aktualisieren würde, aber das tut sie nicht. Also habe ich mal das Kommando Ctrl+F5 eingebaut. In den letzten Tagen was die Seite reichlich träge. so daß ich "Kacheln" im Bild habe. Und ich hatte timeouts, die auch getreulich aufgenommen wurden.... (das kann aber auch an meiner Verbindung hier liegen, also der Verbindung von PC zum Router.
Ich verstehe nicht ganz, was das Ziel dabei sein soll - die Seitenbetreiber sind doch so nett ihre Daten öffentlich zur Verfügung zu stellen (Aktuallisierungsintervall laut FAQ sind 5 Minuten): http://api.luftdaten.info/static/v1/data.json - warum muss man dafür Screenshots einer Webseite anfertigen? Wenn einen die Daten von bestimmten Messstationen interessieren, kann man die doch bequem im Tagesverlauf herunterladen lassen und dann im gewünschten Format plotten.
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi seahawk, zu Nr. 1:
| august@August-Ryzen:~/Temp/Filmchen$ wmctrl -l
0x01a0000a 0 August-Ryzen Schreibtisch
0x01c00010 0 August-Ryzen Neue Antwort › suche: Programm zur Aufnahme vom Bildschirm › Programme › Ubuntu verwenden › Forum › ubuntuusers.de - Mozilla Firefox
0x02c00006 0 August-Ryzen august@August-Ryzen: ~/Temp/Filmchen
0x02a00084 0 August-Ryzen screenshot.sh (~/bin) - gedit
0x02e00007 0 August-Ryzen Filmchen
august@August-Ryzen:~/Temp/Filmchen$ ff_window_id=$(wmctrl -l | awk '/Mozilla Firefox/ {print $1}')
august@August-Ryzen:~/Temp/Filmchen$ echo $ff_window_id
0x01c00010
august@August-Ryzen:~/Temp/Filmchen$ xwd -id "$ff_window_id" -out $(printf "screenshot_01.xwd")
august@August-Ryzen:~/Temp/Filmchen$
|
Der Firefox wird erkannt, die Variable erthält den richtigen Wert aber das Bild ist von der Konsole, habe ich gerade noch einmal ausprobiert. Auf dem RasPi scheint das übrigens zu klappen, denn dort erhalte ich kein Bild vom gesamten Bildschirm, nur den Teil vom Chromium. zu Nr.2:
die Seite ist statisch. Bei meinem ersten Versuch erhielt ich dann einen Film mit dem immer gleichen Bild. Deswegen habe ich das xdotool in das Skript eingebaut. Mein Ziel ist zu zeigen, wie sich die Anzeige über einen Zeitraum von 24 Stunden verändert. Die Werte einzelner Stationen nützen mir da nichts, ich hätte gerne eine grössere Region. Schönen Gruß
AugustQ
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi, ich habe mal meinen Ansatz umgestellt. Jetzt mache ich dies in 3 Schritten:
per wget hole ich mr die Daten der Seite (Skript funkioniert) später lasse ich mir die Seite im Firefox anzeigen, vergrössere/verschiebe sie etwas und mache dann eine Hardcopy per ffmpeg wandle ich dann die Hardcopies in eine mp4-Datei um
Schwierigkeiten habe ich mit dem Schritt 2, der nicht klappt. Das ist mein Skript:
#!/bin/bash
# based on screenshot.sh
# get the data from a given url
rm *.xwd
counter=0
while :
do
if [ ! -d $(printf "luftdaten_%05d" $counter) ]; then break; fi
firefox ./$(printf "luftdaten_%05d" $counter)/maps.luftdaten.info/index.html &
sleep 5
ff_window_id=$(wmctrl -l | awk '/Mozilla Firefox/ {print $1}')
if [ -n "$ff_window_id" ]
then
# xdotool getmouselocation
echo "mousemove"
xdotool mousemove --window $ff_window_id 1066 53
xdotool click --window $ff_window_id left
echo "key end"
xdotool key --window $ff_window_id 'KP_End'
echo "key a"
xdotool key --window $ff_window_id 'a'
xdotool key --window $ff_window_id 'b'
xdotool key --window $ff_window_id 'c'
echo "screenshot"
xwd -id "$ff_window_id" -out $(printf "screenshot_%05d.xwd" $counter)
echo "alt-f4"
xdotool key --window $ff_window_id 'alt+F4'
else
echo "$(date) no firefox instance found"
fi
(( counter++ ))
break
done
exit Die echo-Kommandos habe ich eingebaut, weil ich sehen wollte, ob das Skript durchläuft (es läuft bis zum Ende). Das Skript funktioniert bis zum mousemove, d.h. der Cursor wandert an die richtige Stelle. Der folgende Klick wird nicht mehr ausgeführt. Sinn der Sache:
Teil 1: Bisher habe ich die Daten in den Firefox geholt, gewartet und dann eine hardcopy gemacht. Dies gab Probleme, da die Daten manchmal noch nicht vollständig geholt wurden und somit nur teilweise angezeigt wurden. Jetzt hole ich sie per wget und erhalte sie damit vollständig (denke ich). Teil 2: in meinem jetzigen Ansatz zeige ich die Datei index.html im Firefox an und sehe die Weltkarte. Gehe ich nun in die URL-Zeile und ändere am Ende einige Zeichen, dann erhalte ich den Ausschnitt, den ich haben will. Genau dies klappt aber nicht, zumindest nicht auf dem von mir im Skript beschrittenen Weg. Was mache ich da falsch? Oder gibt es einen besseren Weg? AugustQ PS: das Skript ist nur ein Zwischenstand, das dient zum testen des Ansatzes.
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi, ich habe das Skript mal reduziert auf eine Zeile: ich lasse eine Zeichenfolge in gedit einfügen. Gedit ist natürlich geöffnet. Das ist meine Zeile:
| xdotool key --window $(xdotool search gedit | head -n1) 1 2 3 4
|
Ergebnis: nichts. Lasse ich den Teil --window weg, dann erscheint meine Zeichenfolge auf der Konsole. Wie kriege ich eine Zeichenfolge in ein fremdes Programm? AugustQ
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
OK, einen Schritt weiter: man ersetze in obigem Skript die Zeile
xdotool click --window $ff_window_id left durch diese Zeile:
xdotool click --window $ff_window_id 1 und dann schreibt er meinen Text an die richtige Stelle. Ich spiele weiter damit.
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi, mein Projekt ist beendet. Dabei entstand ein Text, den Du hier finden kannst: https://linux-fuer-wi.blogspot.com/2019/01/diesel-verbot-silvester.html Danke nochmals an alle Unterstützer hier. So ganz ohne Euch hätte ich das nicht hingekriegt. Schönen Gruß
AugustQ PS: ich habe es doch ein wenig anders gemacht, als es hier diskutiert wurde.
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
mal ein bissel Doku: Schritt 1: Bildschirmseiten aufnehmen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | #!/bin/bash
# rm *.xwd
counter=0
while :
do
ff_window_id=$(wmctrl -l | awk '/Mozilla Firefox/ {print $1}')
if [ -n "$ff_window_id" ]
then
xwd -id "$ff_window_id" -out $(printf "screenshot_%05d.xwd" $counter)
xdotool key --window $ff_window_id "ctrl+F5"
else
echo "$(date) no firefox instance found"
fi
(( counter++ ))
sleep 60
done
|
Das habe ich dann über 24 Stunden laufen lassen und erhielt >1400 Dateien mit der Endung xwd. Schritt 2: die xwd-Dateien ins jpeg-Format wandeln (und kopieren)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/bash
#
# convert xwd-files into the jpeg-format
counter=0
while :
do
echo ../$(printf "screenshot_%05d.xwd" $counter)
convert ../$(printf "screenshot_%05d.xwd" $counter) $(printf "screenshot_%05d.jpg" $counter)
(( counter++ ))
if [ ! -e ../$(printf "screenshot_%05d.xwd" $counter) ]
then
break
fi
done
|
Diese Dateien habe ich durchgesehen. Manche davon habe ich entfernt und die Datei vorher/nachher an diese Stelle kopiert. Schritt #3: Uhrzeit einfügen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | #!/bin/bash
#
# add text to file
counter1=1 # the hardcopies
counter2=0 # the intro
while :
do
cp -p silvester_1.jpg $(printf "screenshot_%05d.jpg" $counter2)
(( counter2++ ))
if [ $counter2 -ge 72 ];
then
break
fi
done
while :
do
if [ ! -e ../$(printf "screenshot_%05d.jpg" $counter1) ]
then
break
fi
echo ../$(printf "screenshot_%05d.jpg" $counter1)
text_to_file=$(stat -c %y ../../Originale/$(printf "screenshot_%05d.xwd" $counter1) | cut -d ' ' -f2 | cut -d ':' -f 1,2)
# convert -pointsize 20 -fill black -draw 'text 700, 20 "'$text_to_file'"' ../../Originale/screenshot_00000.jpg screenshot_00000.jpg
# fuer Deutschland
convert -pointsize 20 -fill white -draw 'text 700, 23 "'$text_to_file'"' ../$(printf "screenshot_%05d.jpg" $counter1) $(printf "screenshot_%05d.jpg" $counter2)
(( counter1++ ))
(( counter2++ ))
done
|
Dabei wird erst die Vorspann-Seite (sozusagen der Filmtitel) entsprechend of kopiert und danach die jpeg-Dateien kopiert, in die auch die Aufnahmezeit der Originalaufnahmen (= xwd-Dateien) eingefügt wurde. Schritt 4: aus den jpeg-Dateien einen Film machen
| ffmpeg -framerate 24 -i screenshot_%05d.jpg output_$(date +"%y-%m-%d_%H:%M:%S").mp4
|
Das war es. Klingt ganz einfach. Das war es aber nicht, zumindest nicht für mich. Sonst hätte ich nicht so viele Fragen hier im Forum gestellt. hope that helps. Schönen Gruß
AugustQ PS: ich habe eine Struktur mit Verzeichnissen, die ich hier nicht angegeben habe. Aber das sollte kein Problem sein.
|