exemple record in raylib
This commit is contained in:
commit
8cc73c3bc5
|
@ -0,0 +1,3 @@
|
|||
a.out
|
||||
output.mp4
|
||||
preuve-a-conviction
|
|
@ -0,0 +1,9 @@
|
|||
all:
|
||||
gcc main.c -lraylib
|
||||
|
||||
run: all
|
||||
./a.out
|
||||
mpv ./output.mp4
|
||||
|
||||
clean:
|
||||
rm -f ./a.out output.mp4
|
|
@ -0,0 +1,83 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include "raylib.h"
|
||||
#include "rlgl.h"
|
||||
|
||||
void draw_frame(int frame)
|
||||
{
|
||||
BeginDrawing();
|
||||
{
|
||||
ClearBackground(BEIGE);
|
||||
DrawText(TextFormat("frame: %d", frame), 0, 0, 50, RED);
|
||||
DrawRectangle(frame*3, frame*2, 50, 50, BLUE);
|
||||
}
|
||||
EndDrawing();
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int pipefd[2];
|
||||
pid_t pid;
|
||||
|
||||
if (pipe(pipefd) == -1) {
|
||||
printf("ERR: pipe\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pid = fork();
|
||||
if (pid == -1) {
|
||||
printf("ERR: fork\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (pid == 0) {
|
||||
close(pipefd[1]);
|
||||
|
||||
dup2(pipefd[0], STDIN_FILENO);
|
||||
close(pipefd[0]);
|
||||
|
||||
execlp("ffmpeg", "ffmpeg",
|
||||
"-y",
|
||||
"-f", "rawvideo",
|
||||
"-pix_fmt", "rgba",
|
||||
"-s", "900x600",
|
||||
"-r", "60",
|
||||
"-i", "-",
|
||||
"output.mp4",
|
||||
NULL);
|
||||
|
||||
// unreachable if ffmpeg launch
|
||||
printf("ERR: execlp");
|
||||
return -1;
|
||||
} else {
|
||||
close(pipefd[0]);
|
||||
|
||||
InitWindow(900, 600, "screen record test");
|
||||
// NOTE: lower FPS if frame bug
|
||||
SetTargetFPS(60);
|
||||
Vector2 scale = GetWindowScaleDPI();
|
||||
int width = GetScreenWidth();
|
||||
int height = GetScreenHeight();
|
||||
|
||||
int frame;
|
||||
for (frame = 0; frame < 300; frame++) {
|
||||
draw_frame(frame);
|
||||
|
||||
int w = width*scale.x;
|
||||
int h = height*scale.y;
|
||||
|
||||
unsigned char *screen_data = rlReadScreenPixels(w, h);
|
||||
write(pipefd[1], screen_data, w*h*4*sizeof(*screen_data));
|
||||
|
||||
RL_FREE(screen_data);
|
||||
}
|
||||
|
||||
close(pipefd[1]);
|
||||
wait(NULL);
|
||||
|
||||
printf("%d frame in %.02fs\n", frame, GetTime());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue