Moin,
heute Abend hatte ich die Idee, da ich im Moment Lisp lerne, Videos von Lisp-Sessions aufzunehmen, damit ich mir diese später anschauen kann ohne das dazugehörige Buch lesen zu müssen.
Ich hab das Programm dann prompt Splash gezeigt und wir sind auf die Idee gekommen, dass man noch ganz andere Sachen damit machen kann: Zum Beispiel kann man, wenn etwas am System nicht funktioniert, die kritsichen Stellen aufnehmen und dann hochladen, sodas andere sich den Verlauf anschauen können (und besser analysieren können). Dies ist deutlich besser als einfach nur eine Fehlermeldung zu posten.
Achja, worum es eigentlich geht: Das Programm nimmt eine komplette Konsolensession auf.
Beispiel:
Auf tty7 (X-Server) öffnet ihr eine Konsole. Darin tippt ihr su, um root zu werden. Dann führt ihr das Programm aus. Z.B. so:
# ./aufnahme /dev/vcs1 test.avi
/dev/vcs1 ist die erste Konsole (tty0), ihr könnt natürlcih auch jede andere Konsole aufnehmen. Dann wechslet ihr mit STRG+ALT+Fx in die jeweilige Konsole und tippt dort irgendwas. Später kehrt ihr auf tty7 zurück und drückt in eurem terminal STRG+C. Nun wird ein Video generiert, das ihr euch mit einem Video-Abspiel-Programm eures Vertrauens ansehen könnt.
Benötigt werden:
gd (Graphik-Bibliothek http://www.boutell.com/gd)
mencoder (ist bei mplayer dabei)
Viel Spaß!
Hier ist der Code:
Speichert ihn in einer Datei foo.c und führt folgendes zum Compilieren aus:
gcc -o foo foo.c -lgd
Code:
/* BSD-style Lizenz, Christian Pohlmann */
#include <signal.h>
#include <gd.h>
#include <gdfonts.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
char vid_out[100];
void abbruch (int sig)
{
char cmd[100];
printf("generiere Video... bitte warten");
fflush(stdout);
sprintf(cmd, "mencoder \"mf://*jpg\" -mf type=jpg:fps=10 -o %s -ovc lavc ", vid_out);
system(cmd);
system("rm *jpg");
exit(EXIT_SUCCESS);
}
void capture_img (const char* dev, const char* fname)
{
gdImagePtr im;
gdFontPtr font;
int white, black;
FILE* in, *out;
char buf[81];
int cnt = 0;
im = gdImageCreate(800, 600);
font = gdFontGetSmall();
white = gdImageColorAllocate(im, 255, 255, 255);
black = gdImageColorAllocate(im, 0, 0, 0);
if ((in = fopen(dev, "r+")) == NULL)
{
printf("Konnte angegebenen Device nicht öffnen (Programm muss mit root-Rechten laufen!)\n");
exit(EXIT_FAILURE);
}
while (1)
{
if (fgets(buf, 81, in) == NULL)
break;
buf[80] = 0;
gdImageString(im, font, 0, cnt++ * 20, buf, black);
}
out = fopen(fname, "w+");
gdImageJpeg(im, out, -1);
fclose(out);
gdImageDestroy(im);
}
int main (int argc, char** argv)
{
int frame_cnt;
char fname[20];
char dev[15];
int con_num;
if (argc != 3)
{
printf("Usage: %s <device> <datei>\n");
exit(EXIT_FAILURE);
}
signal(SIGINT, abbruch);
frame_cnt = 0;
strncpy(vid_out, argv[2], 100);
printf("Abbrechen mit STRG+C!\n");
while (1)
{
sprintf(fname, "con%.4d.jpg", ++frame_cnt);
capture_img(argv[1], fname);
usleep(100 * 1000);
}
return 0;
}
PS: Ich weiß, dass es sich hierbei um schmutziges C handelt
) bin für Verbesserungsvorschläge offen
Lesezeichen