#include #include #include #include #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()); } }