「SDL第一篇」入门

作者: 音视频直播技术专家 | 来源:发表于2018-04-07 02:05 被阅读166次

为什么要学习SDL

SDL是 “Simple DirectMedia Layer”的缩写,它是一个开源的项目。其主要用于游戏开发中的多媒体处理,如视频渲染,音频播放,鼠标/键盘控制等操作。

并且它是一个跨平台的多媒体库。也就是说它对外接供了一套统一的接口,但在内部,它会根据不同平台调用不同的底层 API库。如在 Linux 系统下,它会使用 opengl 做渲染,而在 Window 下它会调用 D3D API进行渲染。

我之所以要介绍它,主要是因为我要在开发的多媒体播放器中使用它。

SDL的编译与安装

目前 SDL 分为 SDL1 和 SDL2 两个主要版本。这两上版本差异非常大,无法相兼容。不过SDL1已经基本过时,主流产品都在使用的 SDL2,所以我们这里也使用SDL2作为例子进行讲解。

  • 下载SDL源码可能需要翻墙才行

  • 编译与安装

    • 生成SDL的Makefile

      configure --prefix=/usr/local
      
    • 编译并安装

      sudo make && make install
      

使用 SDL2 的其本流程

当我们通过源码编译并安装好 SDL2后,在我们的程序中使用 SDL2 就非常简单了,只要按照下面的步骤就可以绘制出一个窗口来。

  • 添加SDL头文件

    #include <SDL.h>
    
  • 初始化SDL

  • 创建窗口

  • 销毁窗口

  • 退出SDL

当然,上面的步骤只是一个最基本的使用 SDL 的步骤,如果想了解更多的 SDL 的内容,静请期待我后面的文章。

API详细介绍

下面我们详细介绍一下上面用到的几个SDL API。

  • 初始化 SDL

    int SDL_Init(Uint32 flags)
    
    flags 说明
    SDL_INIT_TIMER timer subsystem
    SDL_INIT_AUDIO audio subsystem
    SDL_INIT_VIDEO video subsystem; automatically initializes the events subsystem
    SDL_INIT_EVENTS events subsystem
    SDL_INIT_EVERYTHING all of the above subsystems

    返回值:0, 成功。非0, 失败。

  • 退出 SDL

    void SDL_Quit(void)
    
  • 打印日志

    void SDL_Log(const char* fmt, ...)
    

    它与 C 语言中的 printf 格式相同。

  • 创建窗口

    SDL_Window* SDL_CreateWindow(const char* title,
                               int         x,
                               int         y,
                               int         w,
                               int         h,
                               Uint32      flags)
    
    • title:窗口标题

    • x,y,w,h:窗口坐标

    • flag

      flags 说明
      SDL_WINDOW_FULLSCREEN fullscreen window
      SDL_WINDOW_FULLSCREEN_DESKTOP fullscreen window at the current desktop resolution
      SDL_WINDOW_OPENGL window usable with OpenGL context
      SDL_WINDOW_HIDDEN window is not visible
      SDL_WINDOW_BORDERLESS no window decoration
      SDL_WINDOW_RESIZABLE window can be resized
      SDL_WINDOW_MINIMIZED window is minimized
      SDL_WINDOW_MAXIMIZED window is maximized
      SDL_WINDOW_SHOWN show window
  • 销毁窗口

    void SDL_DestroyWindow(SDL_Window* window)
    

例子

下面是一个完整的使用SDL创建窗口的例子,你可以在 linux/mac环境下执行它。

#include "SDL.h"
#include <stdio.h>

int main(int argc, char* argv[]) {

    int flag = 1;

    SDL_Window *window;                    // Declare a pointer

    SDL_Init(SDL_INIT_VIDEO);              // Initialize SDL2

    // Create an application window with the following settings:
    window = SDL_CreateWindow(
        "An SDL2 window",                  // window title
        SDL_WINDOWPOS_UNDEFINED,           // initial x position
        SDL_WINDOWPOS_UNDEFINED,           // initial y position
        640,                               // width, in pixels
        480,                               // height, in pixels
        SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS// flags - see below
    );

    // Check that the window was successfully created
    if (window == NULL) {
        // In the case that the window could not be made...
        printf("Could not create window: %s\n", SDL_GetError());
        return 1;
    }

    // The window is open: could enter program loop here (see SDL_PollEvent())

    SDL_Delay(3000);  // Pause execution for 3000 milliseconds, for example
 

    // Close and destroy the window
    SDL_DestroyWindow(window);

    // Clean up
    SDL_Quit();
    return 0;
}

你可以使用下面的命令在linux/mac上编译上面的程序。

gcc/clang -g -o sdl2_base 文件名.c `pkg-config --cflags --libs sdl2`

编译出的程序名为 sdl2_base,执行下面的命令就可能看到运行的结果:

./sdl2_base

需要注意的是,虽然上面的程序可以正常编译执行,但你会发现该程序创建的窗口并不能显示出来。我会在第二篇文章中介绍如何让窗口正常的显示出来

小结

通过本文的介绍大家是不是觉得使用 SDL 非常简单易用呢?当然也许有人不太喜欢 SDL,认为直接使用 opengl 更高效。

但你要知道,SDL不只是对图像渲染做了封装,它还对其它媒体API做了封装,如对音频处理的封装等。这些封装大大减少了我们的开发工作量。

从另一方面讲,SDL 是一款非常优秀有多媒体库,除了使用它,其实我们还可以通过对其源码的分析,从中学到很多使用底层API的技巧。尤其是想学习播放器开发的同学,更是应该学好 SDL,因为著名的 ffplay 就是用的 SDL 做视频和音频的最终渲染与播放的。

最后,希望本文能帮你进行到 SDL 的世界。

相关文章

  • FFmpeg+SDL2实现音频流播放

    SDL2文章列表 SDL2入门 SDL2事件处理 SDL2纹理渲染 SDL2 PCM音频播放 FFmpeg+SDL...

  • FFmpeg+SDL2实现简易音视频同步播放器

    SDL2文章列表 SDL2入门 SDL2事件处理 SDL2纹理渲染 SDL2音频播放 FFmpeg+SDL2实现视...

  • FFmpeg音视频同步

    SDL2文章列表 SDL2入门 SDL2事件处理 SDL2纹理渲染 SDL2音频播放 FFmpeg+SDL2实现视...

  • SDL2音频播放

    SDL2文章列表 SDL2入门 SDL2事件处理 SDL2纹理渲染 本来计划写FFmpeg+SDL2视频播放,但是...

  • FFmpeg+SDL2实现视频流播放

    SDL2文章列表 SDL2入门 SDL2事件处理 SDL2纹理渲染 SDL2音频播放 本篇博客使用FFmpeg+S...

  • SDL2纹理渲染

    SDL2第三篇。 SDL2入门 SDL2事件处理 接下来就看下如何使用SDL如何通过SDL_Texture在窗口绘...

  • 「SDL第四篇」事件处理

    前言 前面我为大家介绍了 SDL 的三个主题: SDL入门 SDL窗口显示 SDL绘制基本图形 今天我为大家介绍一...

  • 非常棒的SDL中文教程

    SDL中文教程 - 游戏编程入门

  • 「SDL第一篇」入门

    为什么要学习SDL SDL是 “Simple DirectMedia Layer”的缩写,它是一个开源的项目。其主...

  • SDL入门

    SDL是什么 SDL的全称是Simple DirectMedia Layer。是一套开源的跨平台多媒体开发库,用C...

网友评论

  • MigrationUK:大佬,您好,请问OpenGL 和sdl同样可以渲染视频有什么区别,和分别什么场景使用:blush:
    音视频直播技术专家:@MigrationUK SDL 是更上层的接口,它在Android系统下用的是 opengl, 在ios下用的是 metal

本文标题:「SDL第一篇」入门

本文链接:https://www.haomeiwen.com/subject/dcyehftx.html