流媒体开发12SDL基本介绍

Posted 叮咚咕噜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流媒体开发12SDL基本介绍相关的知识,希望对你有一定的参考价值。

一、SDL简介

  • SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。
  • 目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。
  • 对于我们课程而言:SDL主要用来辅助学习FFmpeg,所以我们只会关注我们用到的知识点。
  • 官网:https://www.libsdl.org/
  • 文档:http://wiki.libsdl.org/Introduction

二、SDL-环境搭建

2.1Windows环境搭建

  • 下载地址:https://www.libsdl.org/download-2.0.php
  • 先直接下载dll和lib使用

2.2linux环境搭建

  1. 需要下载源码自己进行编译
  2. 下载SDL源码库,SDL2-2.0.10.tar.gz
  3. 解压,然后依次执行命令
    ./configure
    make
    sudo make install.
  4. 如果出现Could not initialize SDL - No available video device (Did you set the DISPLAY variable?)错误,说明系统中没有安装x11的库文件,因此编译出来的SDL库实际上不能用。
    下载安装
sudo apt-get install libx11-dev
sudo 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视频显示函数简介:

  • SDL_Init():初始化SDL系统
  • SDL_CreateWindow():创建窗口SDL_Window
  • SDL_CreateRenderer():创建渲染器SDL_Renderer
  • SDL_CreateTexture():创建纹理SDL_Texture
  • SDL_UpdateTexture():设置纹理的数据
  • SDL_RenderCopy():将纹理的数据拷贝给渲染器
  • SDL_RenderPresent():显示
  • SDL_Delay():工具函数,用于延时
  • SDL_Quit():退出SDL系统

SDL数据结构简介:

  • SDL_Window:代表了一个“窗口”,一个窗口可以同时播放多个视频,可以放多个Texture
  • SDL_Renderer:代表了一个“渲染器”
  • SDL_Texture:代表了一个“纹理”,一个textuure其实是对应一个YUV
  • SDL_Rect:一个简单的矩形结构,确认是画在什么位置的,可以是2*2的形式,不只显示一个

存储RGB和存储纹理的区别:
比如一个从左到右由红色渐变到蓝色的矩形,用存储RGB的话就需要把矩形中每个点的具体颜色值存储下来;而纹理只是一些描述信息,比如记录了矩形的大小、起始颜色、终止颜色等信息,显卡可以通过这些信息推算出矩形块的详细信息。所以相对于存储RGB而已,存储纹理占用的内存要少的多。

四、QT下SDL窗口创建案例

1、创建QT工程

2、项目名输入


3、头文件和库拷贝到当前路径下,并且在pro文件中指定

4、代码初步实现

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

#undef main
int main()
{
    printf("Hello World!\\n");

    SDL_Window *window = NULL;      // 声明窗口

    SDL_Init(SDL_INIT_VIDEO);       // 初始化SDL
    // 创建SDL Window
    window = SDL_CreateWindow("Basic Window",
                              SDL_WINDOWPOS_UNDEFINED,
                              SDL_WINDOWPOS_UNDEFINED,
                              640,
                              480,
                              SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);  //调节窗口大小:SDL_WINDOW_RESIZABLE

    if(!window) // 检测是否创建成功
    {
        printf("Can't create window, err:%s\\n", SDL_GetError());
        return 1;
    }

    SDL_Delay(10000);  // 延迟10000ms

    SDL_DestroyWindow(window); // 消耗窗口

    SDL_Quit(); // 释放资源

    return 0;
}

5、编译运行,将SDL2.dll库拷贝到
\\01-sdl-basic\\build-01-sdl-basic-Desktop_Qt_5_12_1_MinGW_64_bit-Debug目录下

五、

案例解析:
其实就是调用上面接口,实现一个窗口输出,并显示一些内容。

代码实现:

#include <stdio.h>
#include <SDL.h>
#undef main
int main()
{
    int run = 1;
    SDL_Window *window = NULL;
    SDL_Renderer *renderer = NULL;
    SDL_Texture *texture = NULL;
    SDL_Rect rect; // 长方形,原点在左上角
    rect.w = 50;    //方块大小
    rect.h = 50;

    SDL_Init(SDL_INIT_VIDEO);//初始化函数,可以确定希望激活的子系统

    window = SDL_CreateWindow("2 Window",
                              SDL_WINDOWPOS_UNDEFINED,
                              SDL_WINDOWPOS_UNDEFINED,
                              640,
                              480,
                              SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);// 创建窗口

    if (!window)
    {
        return -1;
    }
    renderer = SDL_CreateRenderer(window, -1, 0);//基于窗口创建渲染器
    if (!renderer)
    {
        return -1;
    }

    texture = SDL_CreateTexture(renderer,
                                   SDL_PIXELFORMAT_RGBA8888,
                                   SDL_TEXTUREACCESS_TARGET,
                                   640,
                                   480); //创建纹理

    if (!texture)
    {
        return -1;
    }

    int show_count = 0;
    while (run)
    {
        rect.x = rand() % 600;
        rect.y = rand() % 400;

        SDL_SetRenderTarget(renderer, texture); // 设置渲染目标为纹理
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // 纹理背景为黑色
        SDL_RenderClear(renderer); //清屏

        SDL_RenderDrawRect(renderer, &rect); //绘制一个长方形
        SDL_SetRenderDrawColor(renderer, 0, 255, 255, 255); //长方形为白色
        SDL_RenderFillRect(renderer, &rect);

        SDL_SetRenderTarget(renderer, NULL); //恢复默认,渲染目标为窗口
        SDL_RenderCopy(renderer, texture, NULL, NULL); //拷贝纹理到CPU

        SDL_RenderPresent(renderer); //输出到目标窗口上
        SDL_Delay(300);
        if(show_count++ > 30)
        {
            run = 0;        // 不跑了
        }
    }

    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window); //销毁窗口
    SDL_Quit();
    return 0;
}

运行结果:

以上是关于流媒体开发12SDL基本介绍的主要内容,如果未能解决你的问题,请参考以下文章

流媒体开发14SDL线程

流媒体开发14SDL线程

流媒体开发16SDL-PCM播放

流媒体开发16SDL-PCM播放

流媒体开发13SDL事件响应

流媒体开发13SDL事件响应