Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【FFmpeg】SDL 音视频开发 ① ( SDL 窗口绘制 | SDL 视频显示函数 | SDL_Window 窗口 | SDL_Renderer 渲染器 | SDL_Texture 纹理 )

【FFmpeg】SDL 音视频开发 ① ( SDL 窗口绘制 | SDL 视频显示函数 | SDL_Window 窗口 | SDL_Renderer 渲染器 | SDL_Texture 纹理 )

作者头像
韩曙亮
发布于 2024-06-09 05:53:20
发布于 2024-06-09 05:53:20
31100
代码可运行
举报
运行总次数:0
代码可运行

一、SDL 视频显示函数

1、SDL_Init 函数

使用 SDL 开发库 的 功能 之前 , 都要先 初始化 SDL 系统环境 ;

调用 SDL_Init() 函数 , 可以初始化 SDL 系统上下文环境 , 这是进行 SDL 任何操作之前都必须执行的操作 ;

在该函数中传入 不同子系统 对应的 位掩码 , 初始化不同的子系统 ;

函数原型如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int SDL_Init(Uint32 flags);
  • flags 参数 : 是 位掩码 , 表示 子系统标志位 , 可以通过 | 操作符 同时设置多个 子系统 标志位 , 常用的子系统标志位如下 , 不同的 子系统 可实现的功能不同 ;
    • SDL_INIT_VIDEO : 视频子系统 , 可以 实现 创建窗口 , 渲染器 , 纹理 等功能 ;
    • SDL_INIT_AUDIO:音频子系统 , 可进行声音播放 ;
    • SDL_INIT_EVENTS:事件子系统 , 可处理 鼠标 键盘 等事件 ;
    • SDL_INIT_TIMER : 定时器子系统 , 可实现 SDL 定时器 功能 ;
  • 返回值 : 如果 SDL 系统初始化成功 , 则返回 0 ; 如果初始化失败 , 返回负数 ;

子系统标志位 定义在了 SDL.h 头文件中 ,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 *  \name SDL_INIT_*
 *
 *  These are the flags which may be passed to SDL_Init().  You should
 *  specify the subsystems which you will be using in your application.
 *  这些是可以传递给SDL_Init()的标志。您应该指定将在应用程序中使用的子系统。
 */
/* @{ */
#define SDL_INIT_TIMER          0x00000001u
#define SDL_INIT_AUDIO          0x00000010u
#define SDL_INIT_VIDEO          0x00000020u  /**< SDL_INIT_VIDEO implies SDL_INIT_EVENTS */
#define SDL_INIT_JOYSTICK       0x00000200u  /**< SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS */
#define SDL_INIT_HAPTIC         0x00001000u
#define SDL_INIT_GAMECONTROLLER 0x00002000u  /**< SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK */
#define SDL_INIT_EVENTS         0x00004000u
#define SDL_INIT_SENSOR         0x00008000u
#define SDL_INIT_NOPARACHUTE    0x00100000u  /**< compatibility; this flag is ignored. */
#define SDL_INIT_EVERYTHING ( \
                SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS | \
                SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER | SDL_INIT_SENSOR \
            )
/* @} */

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

#include <SDL.h>

int main()
{
	// ...
	
    // 初始化 SDL 环境 , 用于播放视频
    SDL_Init(SDL_INIT_VIDEO);

2、SDL_Quit 函数

SDL_Init 函数 的作用是 初始化 要使用的各个子系统 , 使用完毕后需要退出 , SDL_Quit 函数 就是退出 SDL 系统 时需要调用的函数 ;

SDL_Quit 函数原型如下 : 该函数没有参数 , 也没有返回值 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void SDL_Quit(void);

SDL_Quit 函数 用于 关闭 SDL 各个子系统 , 释放所有 SDL 申请的系统资源 , 包括

  • 关闭已打开的 SDL 窗口
  • 释放内存中已加载的图像和音频资源所占用的内存空间
  • 停止所有线程 , 避免应用退出后仍然占用 CPU 资源

如果 SDL 应用程序退出前不调用 SDL_Quit 函数 , 会发生 内存泄漏 / 资源泄漏 等问题 ;

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

#include <SDL.h>

#undef main
int main()
{
    // ... 

    // 初始化 SDL 环境 , 用于播放视频
    SDL_Init(SDL_INIT_VIDEO);

	// ... 

    // 释放系统资源
    SDL_Quit();

    return 0;
}

3、SDL_CreateWindow 函数

SDL_CreateWindow 函数 用于 创建 SDL_Window 窗口 , 该函数的函数原型如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SDL_Window* SDL_CreateWindow(const char* title, int x, int y, int w, int h, Uint32 flags);
  • title 参数 : 窗口标题字符串 ;
  • x , y 参数 : 窗口位置 , 左上角坐标 ; 建议使用 SDL_WINDOWPOS_UNDEFINED 自动设置 , 默认是屏幕中心位置 ;
  • w , h 参数 : 窗口宽高 , 单位像素 ;
  • flags 参数 : 窗口属性标志位 , 这个参数也是 位掩码 , 可使用 | 运算符 进行多个位掩码 组合设置 ;
  • SDL_Window* 返回值 : 返回窗口的引用 ;

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 创建 SDL 窗口对象
    SDL_Window *window = NULL;

    // 初始化 SDL 环境 , 用于播放视频
    SDL_Init(SDL_INIT_VIDEO);

    // 创建 SDL Window 窗口对象
    window = SDL_CreateWindow("SDL窗口",
                              SDL_WINDOWPOS_UNDEFINED,
                              SDL_WINDOWPOS_UNDEFINED,
                              800,
                              600,
                              SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);

	// 窗口创建成功 后 进行 渲染 / 事件处理 操作
  
  	// 销毁窗口
    SDL_DestroyWindow(window);   
	// 退出 SDL
    SDL_Quit();  

4、SDL_CreateRenderer 函数

SDL_CreateRenderer 函数 用于创建 渲染器对象 , 渲染器 的作用是 在 SDL_Window 窗口上绘制图像 ;

SDL_CreateRenderer 函数原型如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SDL_Renderer* SDL_CreateRenderer(SDL_Window* window, int index, Uint32 flags);
  • window 参数 : 调用 SDL_CreateWindow 函数创建的 SDL_Window 窗口对象 , 创建 的 渲染器 用于在该窗口中绘制图像 ;
  • index 参数 : 设置 渲染驱动程序的索引 , 设置 -1 表示使用第一个支持指定标志的渲染驱动程序 ;
  • flags 参数 : 一个 或 多个 SDL_RendererFlags 位掩码组合 , 可使用 | 运算符进行或运算组合设置 ;
  • SDL_Renderer* 返回值 : 如果创建渲染器成功 , 则返回新创建的渲染器对象指针 ; 创建失败返回 NULL ;

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 创建 SDL 窗口对象
    SDL_Window *window = NULL;

    // 初始化 SDL 环境 , 用于播放视频
    SDL_Init(SDL_INIT_VIDEO);

    // 创建 SDL_Window 窗口对象
    window = SDL_CreateWindow("SDL窗口",
                              SDL_WINDOWPOS_UNDEFINED,
                              SDL_WINDOWPOS_UNDEFINED,
                              800,
                              600,
                              SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);

	// 创建 SDL_Renderer 渲染器
	SDL_Renderer *renderer = SDL_CreateRenderer(
							  window, -1, SDL_RENDERER_ACCELERATED);   

  	// 销毁窗口
    SDL_DestroyWindow(window);   
	// 退出 SDL
    SDL_Quit();  

5、SDL_CreateTexture 函数

SDL_CreateTexture 函数 用于创建 " 纹理 " 对象 SDL_Texture , 渲染器 使用 纹理对象 绘制图像 ;

SDL_CreateTexture 函数原型如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SDL_Texture* SDL_CreateTexture(SDL_Renderer* renderer, Uint32 format, int access, int w, int h);
  • renderer 参数 : 该参数是 指向已经创建的 SDL_Renderer 对象的指针 , 渲染器对象 使用 该纹理 进行图像绘制 ;
  • format 参数 : 设置 纹理 像素格式 ;
  • access 参数 : 设置纹理的访问权限 ;
    • SDL_TEXTUREACCESS_STATIC 是 不会频繁更新的纹理 ;
    • SDL_TEXTUREACCESS_STREAMING 是 频繁更新的纹理 ;
  • w , h 参数 : 设置纹理宽高 , 单位像素 ;
  • SDL_Texture* 参数 : 创建纹理对象成功 , 则返回 SDL_Texture 对象指针 ; 如果创建失败返回 NULL ;

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 创建 SDL 窗口对象
    SDL_Window *window = NULL;

    // 初始化 SDL 环境 , 用于播放视频
    SDL_Init(SDL_INIT_VIDEO);

    // 创建 SDL_Window 窗口对象
    window = SDL_CreateWindow("SDL窗口",
                              SDL_WINDOWPOS_UNDEFINED,
                              SDL_WINDOWPOS_UNDEFINED,
                              800,
                              600,
                              SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);

	// 创建 SDL_Renderer 渲染器对象
	SDL_Renderer *renderer = SDL_CreateRenderer(
							  window, -1, SDL_RENDERER_ACCELERATED);  

	// 创建 SDL_Texture 纹理对象
	SDL_Texture* texture = SDL_CreateTexture(
							  renderer, 
							  SDL_PIXELFORMAT_RGBA8888, 
							  SDL_TEXTUREACCESS_STATIC, 800, 600); 

  	// 销毁窗口
    SDL_DestroyWindow(window);   
	// 退出 SDL
    SDL_Quit();  

6、窗口 / 渲染器 / 纹理 关联

窗口 SDL_Window , 使用 SDL_CreateWindow 函数创建 ;

渲染器 SDL_Renderer , 使用 SDL_CreateRenderer 函数创建 ;

纹理 SDL_Texture , 使用 SDL_CreateTexture 函数创建 ;

Windows 操作系统中 , 每个应用的窗口都是一个 SDL_Window 对象 ;

在 SDL_Window 窗口 中 , 可以 有多个 SDL_Renderer 渲染器 , 渲染器 可以用于渲染 / 显示 纹理 ; SDL_Renderer 渲染器 是 基于 SDL_Window 窗口对象创建的 ;

每个 SDL_Renderer 渲染器 可以 设置不同的 纹理 SDL_Texture ; SDL_Texture 纹理 是基于 SDL_Renderer 渲染器 对象创建 ;

二、SDL 窗口绘制 - 代码示例


1、SDL 窗口绘制代码

这是在上一篇博客 【FFmpeg】SDL 开发环境搭建 ( SDL 简介 | 下载 SDL 开发库 | 拷贝动态库到 C:\Windows\SysWOW64 目录 | 将 SDL 开发库配置到 Qt 项目 ) 代码的基础上 , 编写的代码 ;

完整代码参考 https://download.csdn.net/download/han1202012/89408757

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

#include <SDL.h>

#undef main
int main(int argc, char* argv[])
{
    printf("Hello World!\n");

    // 创建 SDL 窗口对象
    SDL_Window *window = NULL;

    // 初始化 SDL 环境 , 用于播放视频
    SDL_Init(SDL_INIT_VIDEO);

    // 创建 SDL Window 窗口对象
    window = SDL_CreateWindow("SDL窗口",
                              SDL_WINDOWPOS_UNDEFINED,
                              SDL_WINDOWPOS_UNDEFINED,
                              800,
                              600,
                              SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);


    // 创建 SDL_Renderer 渲染器对象
    SDL_Renderer *renderer = SDL_CreateRenderer(
                window, -1, 0);

    // 创建 SDL_Texture 纹理对象
    SDL_Texture* texture = SDL_CreateTexture(
                renderer,
                SDL_PIXELFORMAT_RGBA8888,
                SDL_TEXTUREACCESS_TARGET,
                800, 600);


    // 为 渲染器 设置 纹理
    SDL_SetRenderTarget(renderer, texture);
    // 设置红色背景, 后面四个参数分别是 RGBA
    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
    // 清除屏幕
    SDL_RenderClear(renderer);

    // 在 (100, 100) 位置绘制 100x100 像素大小的矩形
    SDL_Rect rect;
    rect.x = 100;
    rect.y = 100;
    rect.w = 100;
    rect.h = 100;

    // 渲染器绘制矩形
    SDL_RenderDrawRect(renderer, &rect);
    // 设置绘制矩形颜色为白色 最后四位参数是 RGBA
    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
    // 设置矩形为颜色填充
    SDL_RenderFillRect(renderer, &rect);

    // 设置渲染目标为窗口
    SDL_SetRenderTarget(renderer, NULL);
    // 拷贝纹理到 CPU 中
    SDL_RenderCopy(renderer, texture, NULL, NULL);

    // 输出渲染器渲染内容
    SDL_RenderPresent(renderer);

    // 延迟 3 秒
    SDL_Delay(10000);

    // 关闭窗口
    SDL_DestroyWindow(window);

    // 释放系统资源
    SDL_Quit();

    return 0;
}

2、执行结果

执行结果如下图所示 :

执行后 , 弹出如下窗口 , 窗口背景为红色 , 在 窗口的 (100, 100) 像素位置 绘制了 100x100 像素大小的矩形 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【FFmpeg】SDL 音视频开发 ② ( SDL 视频显示函数 | 设置渲染器目标纹理 | 设置渲染器颜色 | 清除渲染器 | 渲染器绘制矩形 | 纹理拷贝 | 窗口中显示渲染纹理 )
博客源码下载 : https://download.csdn.net/download/han1202012/89421317
韩曙亮
2024/06/13
2260
【FFmpeg】SDL 音视频开发 ② ( SDL 视频显示函数 | 设置渲染器目标纹理 | 设置渲染器颜色 | 清除渲染器 | 渲染器绘制矩形 | 纹理拷贝 | 窗口中显示渲染纹理 )
SDL2库(2)-Android 端集成FFmpeg及简单的播放器
项目位置 https://github.com/deepsadness/SDLCmakeDemo
deep_sadness
2018/12/14
1.7K0
SDL2库(2)-Android 端集成FFmpeg及简单的播放器
【FFmpeg】SDL 音视频开发 ⑤ ( SDL 播放 YUV 视频 | SDL 播放 YUV 画面流程 | YUV 视频存放位置 | 刷新控制子线程 | 主线程事件处理 )
在 【FFmpeg】SDL 音视频开发 ① ( SDL 窗口绘制 | SDL 视频显示函数 | SDL_Window 窗口 | SDL_Renderer 渲染器 | SDL_Texture 纹理 ) 博客中 , 介绍了
韩曙亮
2024/09/06
1700
【FFmpeg】SDL 音视频开发 ⑤ ( SDL 播放 YUV 视频 | SDL 播放 YUV 画面流程 | YUV 视频存放位置 | 刷新控制子线程 | 主线程事件处理 )
C++游戏开发:实现2D/3D游戏逻辑和渲染
在游戏开发中,C++是一种广泛使用的高效编程语言。它提供了强大的功能和灵活性,适用于实现2D和3D游戏的逻辑和渲染。本篇博客将介绍使用C++实现游戏逻辑和渲染的基本原理。
大盘鸡拌面
2023/12/02
1.4K0
「SDL第二篇」窗口渲染
上一篇文章中我们对SDL作了简单的介绍,重点介绍了如何编译SDL以及如何使用它。在文章的最后我们留下了一个疑问,即虽然我们创建了窗口,但窗口却并没有真正显示出来。
音视频_李超
2020/04/02
1.6K0
音视频技术(5)-iOS ffmpeg+SDL播放视频
参照SDL官网文档说明,iOS上使用SDL显示图像,需要修改main入口,SDL有自己的appdelegate实现,
公号sumsmile
2020/03/27
1.4K0
「SDL第八篇」支持倍速与慢放的YUV视频播放器
今天向大家介绍一下如何通过 SDL 实现一个YUV视频播放器。它与上次介绍的音频播放器一样,也是一个简单的不能再简单的播放器了。只不过一个是播放的音频PCM数据,另一个播放的时视频YUV数据。
音视频_李超
2020/04/02
1.1K0
【FFmpeg】SDL 音视频开发 ⑥ ( SDL 播放 YUV 视频 | YUV 4:2:0 采样 | YUV420P 格式介绍 | 获取 YUV 视频文件 | 读取并加载 YUV 画面数据 )
博客源码下载 : https://download.csdn.net/download/han1202012/89717218 ;
韩曙亮
2024/09/06
2090
【FFmpeg】SDL 音视频开发 ⑥ ( SDL 播放 YUV 视频 | YUV 4:2:0 采样 | YUV420P 格式介绍 | 获取 YUV 视频文件 | 读取并加载 YUV 画面数据 )
「SDL第三篇」绘制基本图形
之前的SDL的两篇文章我向大家介绍了如何编译使用 SDL,以及如何才能让窗口显示出来。想了解相关内容的同学可以点击下面的链接查看相关内容。
音视频_李超
2020/04/02
2K0
「SDL第三篇」绘制基本图形
FFmpeg简易播放器的实现-最简版
下图引用自“雷霄骅,视音频编解码技术零基础学习方法”,因原图太小,看不太清楚,故重新制作了一张图片。
叶余
2019/04/02
1.5K0
FFmpeg简易播放器的实现-最简版
SDL2:封装媒体显示播放Csdl2
https://github.com/gongluck/SDL2-study/tree/master/Csdl2
gongluck
2019/06/22
5850
FFmpeg_3.2.4+SDL_2.0.5学习(1)音视频解码帧及显示/播放数据
int OpenAVFile(const char* szFileName) { char errbuf[256] = { 0 }; int iRes = 0; int vindex = -1; AVFormatContext* pFmtCtx = NULL; AVCodecContext* vCodecCtx = NULL; AVCodec* vCodec = NULL; AVPacket* pkt = NULL; AVFrame* pfe = NULL; AVFrame* YUV =
_gongluck
2018/03/08
1.5K0
使用SDL2显示一张图片,SDL2上手贴
SDL全名Simple DirectMedia Layer,是一个跨平台的底层音频、视频、键盘、鼠标操作库,操作实际通过更底层的OpenGL/Direct3D完成,在保留跨平台的兼容性之外提供了非常高的效率,所以广泛的应用在多种游戏和对速度敏感的应用中,比如鼎鼎大名的steam平台/ffmpeg/qemu/模拟器等,当前的版本是2.0。更详细的资料可以访问官网:https://www.libsdl.org/。 SDL2的编程理念清晰易用,代码简洁高效,这里用显式一副图片的最简代码来作为入门的示例,正式
俺踏月色而来
2018/06/15
1.8K0
SDL2来源分析3:渲染(SDL_Renderer)
=====================================================
全栈程序员站长
2022/07/06
3.2K0
SDL2来源分析3:渲染(SDL_Renderer)
结合ffmpeg用SDL播放YUV实现简易播放器
通过解码之后得到的yuv视频数据我们直接可以进行播放,本篇使用SDL来实现视频播放。
曾大稳
2018/09/11
1.3K0
【音视频连载-005】基础学习篇-SDL 加载 YUV 文件并显示
在前面的文章中已经完成了图片的加载和显示,接下来要做的就是加载 YUV 文件并显示。
音视频开发进阶
2020/03/11
9840
SDL2库(3)-Android 端源码简要分析(VideoSubSystem)参考
项目位置 https://github.com/deepsadness/SDLCmakeDemo
deep_sadness
2018/12/14
3K0
SDL2库(3)-Android 端源码简要分析(VideoSubSystem)参考
SDL2库(1)-移植Android 端 CMakeList 集成
项目位置 https://github.com/deepsadness/SDLCmakeDemo
deep_sadness
2018/12/14
2.7K0
SDL2库(1)-移植Android 端 CMakeList 集成
golang调用sdl2,播放yuv视频
golang调用sdl2,播放yuv视频win10 x64下测试成功,其他操作系统下不保证成功。采用的是syscall方式,不是cgo方式。见地址代码如下:package mainimport ("fmt""github.com/moonfdd/sdl2-go/sdl""github.com/moonfdd/sdl2-go/sdlcommon""io/ioutil""time""unsafe")const REFRESH_EVENT = sdl.SDL_USEREVENT + 1 // 请求画面刷新事件co
福大大架构师每日一题
2022/06/16
3750
golang调用sdl2,播放yuv视频
推荐阅读
相关推荐
【FFmpeg】SDL 音视频开发 ② ( SDL 视频显示函数 | 设置渲染器目标纹理 | 设置渲染器颜色 | 清除渲染器 | 渲染器绘制矩形 | 纹理拷贝 | 窗口中显示渲染纹理 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验