(音视频学习笔记):SDL环境搭建及应用介绍
发布日期:2021-05-07 15:20:23 浏览次数:24 分类:精选文章

本文共 5106 字,大约阅读时间需要 17 分钟。

SDL 开发指南

简介

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,主要使用C语言编写。SDL 提供了丰富的函数接口,支持图像、声音和输出等多种多媒体功能,使开发者能够通过相似的代码在不同平台(如 Linux、Windows、Mac OS X 等)上开发应用程序。SDL广泛应用于游戏开发、模拟器、媒体播放器等多媒体领域。

环境搭建

Windows 环境搭建

  • 下载地址:访问 SDL 的官方网站或相关镜像站点下载最新版本的 SDL。
  • 安装依赖:在 Windows 环境中,确保安装了所有必要的依赖库,例如 x11-dev 等。
  • Linux 环境搭建

  • 下载源码:从 SDL 的官方网站下载源码包,例如 SDL2-2.0.10.tar.gz。
  • 编译安装:解压源码包,进入目录执行以下命令:
    ./configuresudo make install
  • 安装依赖:如果在编译过程中遇到 Could not initialize SDL - No available video device 错误,说明系统中没有安装 x11 库文件。运行以下命令安装相关依赖:
    sudo apt-get install libx11-devsudo apt-get install xorg-dev
  • SDL 子系统

    SDL 将功能分成多个子系统(subsystem),具体包括:

    • SDL_INIT_TIMER:定时器
    • SDL_INIT_AUDIO:音频
    • SDL_INIT_VIDEO:视频
    • SDL_INIT_JOYSTICK:摇杆
    • SDL_INIT_HAPTIC:触摸屏
    • SDL_INIT_GAMECONTROLLER:游戏控制器
    • SDL_INIT_EVENTS:事件
    • SDL_INIT_EVERYTHING:包含所有子系统

    SDL Window 显示

    基本操作

  • 初始化 SDL 系统:
    SDL_Init(SDL_INIT_VIDEO);
  • 创建窗口:
    SDL_Window *window = NULL;window = SDL_CreateWindow("Basic Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
  • 创建渲染器:
    SDL_Renderer *renderer = NULL;renderer = SDL_CreateRenderer(window, -1, 0);
  • 创建纹理并设置数据:
    SDL_Texture *texture = NULL;texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 640, 480);
  • 更新纹理数据:
    SDL_UpdateTexture(texture, NULL, pixels, pitch);
  • 渲染并显示:
    SDL_RenderCopy(renderer, texture, NULL, NULL);SDL_RenderPresent(renderer);
  • 事件处理

    常用事件类型

    • SDL_WaitEvent():等待一个事件。
    • SDL_PushEvent():发送一个事件。
    • SDL_PumpEvents():将硬件产生的事件放入队列。
    • SDL_PeekEvents():从队列中提取一个事件。
    • SDL_Event:事件结构体。

    示例代码

    #include 
    #include
    int main() { SDL_Window *window = NULL; SDL_Event event; int b_exit = 0; // 初始化 SDL_Init(SDL_INIT_VIDEO); window = SDL_CreateWindow("Event Example", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS); if (!window) { printf("Could not create window: %s\n", SDL_GetError()); return 1; } // 创建渲染器 SDL_Renderer *renderer = NULL; renderer = SDL_CreateRenderer(window, -1, 0); // 设置颜色 SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // 清屏并绘制 SDL_RenderClear(renderer); SDL_RenderPresent(renderer); // 处理事件 while (!b_exit) { SDL_WaitEvent(&event); switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_a: printf("Key down a\n"); break; case SDLK_s: printf("Key down s\n"); break; case SDLK_d: printf("Key down d\n"); break; case SDLK_q: printf("Key down q and push quit event\n"); event.type = FF_QUIT_EVENT; SDL_PushEvent(&event); break; default: printf("Key down 0x%x\n", event.key.keysym.sym); break; } break; case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_LEFT) { printf("Mouse down left\n"); } else if (event.button.button == SDL_BUTTON_RIGHT) { printf("Mouse down right\n"); } else { printf("Mouse down %d\n", event.button.button); } break; case FF_QUIT_EVENT: printf("Receive quit event\n"); b_exit = 1; break; } } // 销毁资源 SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0;}

    多线程开发

    基本操作

  • 创建线程
    SDL_Thread *t = SDL_CreateThread(thread_work, "thread_work", NULL);
  • 等待线程
    SDL_WaitThread(t, NULL);
  • 锁机制
    SDL_mutex *s_lock = SDL_CreateMutex();// 获取锁SDL_LockMutex(s_lock);// 提供资源并等待信号SDL_CondWait(s_cond, s_lock);// 释放锁SDL_UnlockMutex(s_lock);
  • 示例代码

    #include 
    #include
    int main() { static SDL_mutex *s_lock = NULL; static SDL_cond *s_cond = NULL; // 初始化 s_lock = SDL_CreateMutex(); s_cond = SDL_CreateCond(); if (!s_lock || !s_cond) { printf("Failed to create mutex/condition: %s\n", SDL_GetError()); return -1; } // 创建子线程 SDL_Thread *t = SDL_CreateThread(thread_work, "thread_work", NULL); if (!t) { printf("Failed to create thread: %s\n", SDL_GetError()); return -1; } // 等待子线程完成 for (int i = 0; i < 2; ++i) { sleep(2); printf("Main thread: =========>\n"); } // 提供信号 printf("Main thread: ==========================\n"); SDL_LockMutex(s_lock); SDL_CondSignal(s_cond); printf("Main thread: ==========================\n"); sleep(10); // 释放锁 SDL_UnlockMutex(s_lock); printf("Main thread: ==========================\n"); // 等待子线程 SDL_WaitThread(t, NULL); printf("Main thread: thread completed\n"); // 销毁资源 SDL_DestroyMutex(s_lock); SDL_DestroyCond(s_cond); return 0;}

    总结

    通过以上内容,可以了解 SDL 的基本使用方法及其相关功能。从环境搭建到多线程开发,SDL 为开发者提供了强大的多媒体开发工具,广泛应用于游戏、媒体播放等领域。

    上一篇:(音视频学习笔记):SDL-YUV显示-播放音频PCM
    下一篇:(音视频学习笔记):FFmpeg 滤镜

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月12日 02时55分57秒