本篇主要用于记录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入门的更多相关文章

  1. SDL入门教程(一):3、MinGW 下的安装与设置

    作者:龙飞 3.1:MinGW 是什么? MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境.MinGW 收集了一系列免费的Windows 使用的头文件和库文件:同时整合了GN ...

  2. SDL相关资料

    SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,适用于 游戏.游戏SDK.演示软件.模拟器.MPEG播放器和其他应用软件.目前支持windows,linux ...

  3. SDL 简单入门学习

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 概要 实际学习使用SDL创建窗体,并绘制图形. 前言 今天想要做一个简单的demo ...

  4. linux之x86裁剪移植---字符界面sdl开发入门

    linux下有没有TurboC2.0那样的画点.线.圆的图形函数库,有没有grapihcs.h,或者与之相对应或相似的函数库是什么?有没有DirectX这样的游戏开发库?SDL就是其中之一. SDL( ...

  5. SDL 威胁建模工具入门 threat modeling tool

    http://msdn.microsoft.com/zh-cn/magazine/dd347831.aspx threat modeling tool 威胁建模工具 minifuzz 文件模糊工具 c ...

  6. Maven学习总结(一)——Maven入门——转载

    一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1. ...

  7. Windows下FFmpeg快速入门

    本系列文章导航 Windows下FFmpeg快速入门 ffmpeg参数解释 mencoder和ffmpeg参数详解(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进行视 ...

  8. Windows下FFmpeg高速入门

    本系列文章导航 Windows下FFmpeg高速入门 ffmpeg參数解释 mencoder和ffmpeg參数具体解释(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进 ...

  9. 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词

    package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr. ...

  10. Windows下FFmpeg快速入门 <第二篇>

    FFmpeg简介 FFmpeg是什么? FFmpeg是用于录制.转换和流化音频和视频的完整解决方案, 包括 libavcodec ,一套领先的音/视频编解码类库.FFmpeg 在Linux上开发,当可 ...

随机推荐

  1. 攻防世界 debug

    题目 分析过程 丢到PE里面 一开始,我看到下面的脱壳提示,以为是我没见过的壳,下载了相关工具脱壳--发现脱了后又出现没见过的脱壳提示,根据提示脱壳弄出来的东西怪怪的 卡题,查了资料 学到一个新知识点 ...

  2. 基于pdfbox实现的pdf添加文字水印工具

    简述 最近有个需求需要给pdf加文字水印,于是开始搜索大法,但是发现网络上的代码基本都是将字体文件直接放在jar包里面.个人强迫症发作(手动狗头),想要像poi一样直接加载系统字体,于是研究了一下午p ...

  3. HarmonyOS Connect认证测试

     原文链接:https://mp.weixin.qq.com/s/zRG97PWPqfDo0vfwQWSUew,点击链接查看更多技术内容:   在HarmonyOS Connect生态产品的认证测试过 ...

  4. RestTemplate进行https请求时适配信任证书

    转载请注明出处: 1.http协议请求 使用RestTemplate进行http协议的请求时,不需要考虑证书验证相关问题,以下为使用RestTemplate直接使用的代码示例: import org. ...

  5. keystore 生成密钥

    前言 在安卓中,我们需要生存keystore来处理我们的证书: 我们很幸运在keystore中,在java中的bin下,已经有了keytool工具了,感谢java社区工作者. 正文 在命令窗口中使用k ...

  6. Greenplum Jdbc 调用 SETOF refcursor

    最近公司需要用Greenplum,在调用 jdbc的时候遇到了一些问题.由于我们前提的业务都是使用 sqlserver,sqlserver的 procedure 在前端展示做数据源的时候才用的非常多, ...

  7. argparse命令行参数的使用

    import argparse def main(): #设置一些参数 parser = argparse.ArgumentParser() parser.add_argument('--device ...

  8. 19_非单文件名组件中VueComponent构造函数&重要的内置关系

    总结: 关于VueComponent:     1.school组件本质上是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的.     2.我们只需要写&l ...

  9. 力扣504(java)-七进制数(简单)

    题目: 给定一个整数 num,将其转化为 7 进制,并以字符串形式输出. 示例 1: 输入: num = 100输出: "202"示例 2: 输入: num = -7输出: &qu ...

  10. 编码原则 : DRY, KISS, YAGNI, S.O.L.I.D

    Dont Repeat Yourself. Keep is Simple, Stupid. You Ain't Gonna Need It.  你不需要它 ( 不试图添加你认为以后可能需要的代码,适可 ...