SDL入门
本篇主要用于记录SDL2.0.22的基本用法,参考别人的代码,并加了注释方便理解这些api
以下两个demo可以在VS中编译并运行,代码参考 SDL视频显示_奋斗吧!骚年!的博客-CSDN博客
1、SimpleSDL
这个demo使用SDL api来播放yuv视频,运行可以发现窗口并不能移动或者缩放
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> extern "C"
{
#include "SDL.h"
} int main(int argc, char* argv[]) {
// 窗口大小
int screen_w = 1000;
int screen_h = 1000; // 视频大小
const int pixel_w = 352, pixel_h = 288;
const int bpp = 12; // 这里buffer大小为 1 帧数据 width * height * 3 / 2,主要是因为YUV420这种采样方式
unsigned char buffer[pixel_w * pixel_h * bpp / 8]; // 初始化SDL
if (SDL_Init(SDL_INIT_VIDEO))
{
printf("could not initialize SDL: %s\n", SDL_GetError());
return -1;
} // 创建一个SDL_Window
// 第二个参数、第三个参数是相对于显示器左上角的坐标
// 第四个参数、第五个参数是窗口大小
// 最后一个参数为窗口选项
SDL_Window *screen = SDL_CreateWindow("SimpleSDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, screen_w, screen_h, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
if (!screen)
{
printf("could not create window: %s\n", SDL_GetError());
return -1;
} // 创建一个SDL_Render对象,第一个参数为SDL_Window,第二个参数为图层序号、第三个参数为flags
SDL_Renderer *sdlRenderer = SDL_CreateRenderer(screen, -1, 0); // 数据的存储格式
Uint32 pixformat = SDL_PIXELFORMAT_IYUV; // 创建一个SDL_Texture对象
// 第一个参数为SDL_Render
// 第二个参数为数据格式
//
// 第四第五个为视频的宽高
SDL_Texture* sdlTexture = SDL_CreateTexture(sdlRenderer, pixformat, SDL_TEXTUREACCESS_STREAMING, pixel_w, pixel_h); FILE *fp = fopen("E:\\Videos\\YUV\\352_288.yuv", "rb+");
if (fp == NULL) {
printf("cannot open this file\n");
return -1;
} // 这个sdlRect表示渲染的视频相对窗口的位置
SDL_Rect sdlRect;
sdlRect.x = 20;
sdlRect.y = 50;
sdlRect.w = screen_w;
sdlRect.h = screen_h; int i = 0; while (1) {
if (fread(buffer, 1, pixel_w * pixel_h * bpp / 8, fp) != pixel_w * pixel_h * bpp / 8) {
// Loop
fseek(fp, 0, SEEK_SET);
fread(buffer, 1, pixel_w * pixel_h * bpp / 8, fp);
} // 更新SDL_Texture
// 最后一个参数为 pitch
SDL_UpdateTexture(sdlTexture, NULL, buffer, pixel_w); // 清除Render中的数据
SDL_RenderClear(sdlRenderer);
// 将sdltexture中的数据拷贝给render
// 第三个参数SDL_Rect表示拷贝的数据范围
// 第四个参数SDL_Rect表示渲染的大小以及相对渲染窗口的位置
SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect);
// 渲染
SDL_RenderPresent(sdlRenderer);
//Delay 40ms
SDL_Delay(40); }
SDL_Quit();
return 0;
}
2、advanced SDL
主要用了消息事件机制来做视频播放,这时候窗口可以自由移动并且缩放
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> extern "C"
{
#include "SDL.h"
} // 自定义事件
//Refresh Event
#define REFRESH_EVENT (SDL_USEREVENT + 1)
//Break
#define BREAK_EVENT (SDL_USEREVENT + 2) int thread_exit = 0; int refresh_video(void* opaque) {
thread_exit = 0;
while (thread_exit == 0) {
// 每隔40ms发送一个Refresh
SDL_Event event;
event.type = REFRESH_EVENT;
SDL_PushEvent(&event);
SDL_Delay(4000);
}
thread_exit = 0;
//Break
SDL_Event event;
event.type = BREAK_EVENT;
SDL_PushEvent(&event);
return 0;
} int main(int argc, char* argv[])
{
const int bpp = 12; int screen_w = 500, screen_h = 500;
const int pixel_w = 352, pixel_h = 288; unsigned char buffer[pixel_w * pixel_h * bpp / 8]; if (SDL_Init(SDL_INIT_VIDEO)) {
printf("Could not initialize SDL - %s\n", SDL_GetError());
return -1;
} SDL_Window* screen = SDL_CreateWindow("Advanced SDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
screen_w, screen_h, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
if (!screen) {
printf("SDL: could not create window - exiting:%s\n", SDL_GetError());
return -1;
} SDL_Renderer* sdlRenderer = SDL_CreateRenderer(screen, -1, 0); Uint32 pixformat = SDL_PIXELFORMAT_IYUV; SDL_Texture* sdlTexture = SDL_CreateTexture(sdlRenderer, pixformat, SDL_TEXTUREACCESS_STREAMING, pixel_w, pixel_h); FILE *fp = fopen("E:\\Videos\\YUV\\352_288.yuv", "rb+");
if (fp == NULL) {
printf("cannot open this file\n");
return -1;
} SDL_Rect sdlRect; // 创建一个SDL线程
SDL_Thread* refresh_thread = SDL_CreateThread(refresh_video, NULL, NULL);
SDL_Event event;
while (1) {
// Wait 阻塞等待事件
SDL_WaitEvent(&event);
if (event.type == REFRESH_EVENT) { //如果是刷新事件
if (fread(buffer, 1, pixel_w * pixel_h * bpp / 8, fp) != pixel_w * pixel_h * bpp / 8) {
// Loop
fseek(fp, 0, SEEK_SET);
fread(buffer, 1, pixel_w * pixel_h * bpp / 8, fp);
} SDL_UpdateTexture(sdlTexture, NULL, buffer, pixel_w); //FIX: If window is resize
// 重新设置渲染区域
sdlRect.x = 0;
sdlRect.y = 0;
sdlRect.w = screen_w;
sdlRect.h = screen_h; SDL_RenderClear(sdlRenderer);
SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect);
SDL_RenderPresent(sdlRenderer); }
else if (event.type == SDL_WINDOWEVENT) {
//If Resize
// 如果窗口发生改变,那么就获取窗口大小
SDL_GetWindowSize(screen, &screen_w, &screen_h);
}
else if (event.type == SDL_QUIT) {//如果退出
thread_exit = 1; //让线程安全退出
}
else if (event.type == BREAK_EVENT) {
break;
}
}
SDL_Quit();
return 0;
}
SDL入门的更多相关文章
- SDL入门教程(一):3、MinGW 下的安装与设置
作者:龙飞 3.1:MinGW 是什么? MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境.MinGW 收集了一系列免费的Windows 使用的头文件和库文件:同时整合了GN ...
- SDL相关资料
SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,适用于 游戏.游戏SDK.演示软件.模拟器.MPEG播放器和其他应用软件.目前支持windows,linux ...
- SDL 简单入门学习
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 概要 实际学习使用SDL创建窗体,并绘制图形. 前言 今天想要做一个简单的demo ...
- linux之x86裁剪移植---字符界面sdl开发入门
linux下有没有TurboC2.0那样的画点.线.圆的图形函数库,有没有grapihcs.h,或者与之相对应或相似的函数库是什么?有没有DirectX这样的游戏开发库?SDL就是其中之一. SDL( ...
- SDL 威胁建模工具入门 threat modeling tool
http://msdn.microsoft.com/zh-cn/magazine/dd347831.aspx threat modeling tool 威胁建模工具 minifuzz 文件模糊工具 c ...
- Maven学习总结(一)——Maven入门——转载
一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1. ...
- Windows下FFmpeg快速入门
本系列文章导航 Windows下FFmpeg快速入门 ffmpeg参数解释 mencoder和ffmpeg参数详解(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进行视 ...
- Windows下FFmpeg高速入门
本系列文章导航 Windows下FFmpeg高速入门 ffmpeg參数解释 mencoder和ffmpeg參数具体解释(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进 ...
- 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词
package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr. ...
- Windows下FFmpeg快速入门 <第二篇>
FFmpeg简介 FFmpeg是什么? FFmpeg是用于录制.转换和流化音频和视频的完整解决方案, 包括 libavcodec ,一套领先的音/视频编解码类库.FFmpeg 在Linux上开发,当可 ...
随机推荐
- HarmonyOS网络管理开发—Socket连接
简介 Socket连接主要是通过Socket进行数据传输,支持TCP/UDP/TLS协议. 基本概念 ● Socket:套接字,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. ● ...
- 报表工具能用来做 DashBoard 和大屏吗?
我们首先来理一下 DashBoard.大屏和报表的关系. DashBoard 是指企业仪表盘,也叫管理者驾驶舱,通常被简称为 DBD.从表现形式上来看,DBD 由多个决策者关注的各类指标数据拼接而成, ...
- sql 语句系列(列举非索引外键)[八百章之第九章]
列举非索引外键 列举出那些外键没有添加索引. 目的: 1.减少锁. 2.外键添加索引,提示了查询性能,因为要与父表做连接查询做笛卡尔积. 下面只要会复制即可,没有会去从新写一遍的. select fk ...
- MMDeploy部署实战系列【第一章】:Docker,Nvidia-docker安装
MMDeploy部署实战系列[第一章]:Docker,Nvidia-docker安装 这个系列是一个随笔,是我走过的一些路,有些地方可能不太完善.如果有那个地方没看懂,评论区问就可以,我给补充. 版权 ...
- ORA-29277:invalid SMTP operation
ORA-29277:invalid SMTP operation 邮件发送的时候出现报错 ORA-29277:invalid SMTP operation 官方解释就很简单 但是实际上重试是不行的,几 ...
- 如何合理使用 CPU 管理策略,提升容器性能?
简介:CPU Burst.拓扑感知调度是阿里云容器服务 ACK 提升应用性能的两大利器,它们解决了不同场景下的 CPU 资源管理,可以共同使用.点击下文,查看详情! 作者:张佐玮(佑祎) 前言 在云 ...
- 钉钉宜搭亮相“第二届ISIG中国产业智能大会”:云钉低代码,构建企业酷应用
简介:低代码年度行业盛会!钉钉宜搭创始人叶周全受邀出席并发表主题演讲. 12月8日,由中国电子技术标准化研究院指导,RPA中国.LowCode低码时代.信创中国联合举办的"第二届ISIG中 ...
- 双11特刊|购物车实时显示到手价,看云原生内存数据库Tair如何提升用户体验?
阿里云自研内存数据库Tair诞生于2009年,是一种支持高并发低延迟访问的云原生内存数据库,完全兼容Redis,已历经多年双11大促考验,提供核心在线访问加速能力,显著提升系统吞吐量. 作为双11大 ...
- [DApp] ethers.js VS Moralis
ether.js 是 Web3 封装的 js 库,特别适合以太坊平台. Moralis 不仅是 Web3 的封装,还是一体化解决方案,包括服务端部署方案和适配各种链,使用范围更广. 在选择上,主要还是 ...
- Roslyn 将构建时间写入到输出文件
我期望在每次构建完成之后,创建一个文件,在这个文件里面写入是什么时间构建的.这个需求实现非常简单,只需要使用 Target 在构建完成,使用 WriteLinesToFile 方法写入时间到输出文件即 ...