当前位置: 首页 > news >正文

十、sdl显示yuv图片

前言

SDL中内置加载BMP的API,使用起来会更加简单,便于初学者学习使用SDL

如果需要加载JPG、PNG等其他格式的图片,可以使用第三方库:SDL_image


测试环境:

  • ffmpeg的4.3.2自行编译版本
  • windows环境
  • qt5.12
  • sdl2.0.22(mingw编译器)

显示yuv图片需要知道yuv图片的尺寸和采样格式

ffplay -video_size 564x513 -pixel_format yuv420p out.yuv

完整代码:

SdlShowYuvThread.h

#ifndef SDLSHOWYUVTHREAD_H
#define SDLSHOWYUVTHREAD_H#include <QObject>
#include <QThread>class SdlShowYuvThread : public QThread
{Q_OBJECT
public:explicit SdlShowYuvThread(QObject *parent = nullptr);~SdlShowYuvThread();signals:// QThread interface
protected:virtual void run() override;
};#endif // SDLSHOWYUVTHREAD_H

SdlShowYuvThread.cpp

#include "sdlshowyuvthread.h"#include <SDL2/SDL.h>
#include <QDebug>
#include <QFile>#define END(judge, func) \if (judge) { \qDebug() << #func << "error" << SDL_GetError(); \goto end; \}#define FILENAME "E:/media/picture-test-yuv420p.yuv"
#define PIXEL_FORMAT SDL_PIXELFORMAT_IYUV
#define IMG_W 1928
#define IMG_H 1048SdlShowYuvThread::SdlShowYuvThread(QObject *parent) : QThread(parent)
{// 当监听到线程结束时(finished),就调用deleteLater回收内存connect(this,&SdlShowYuvThread::finished,this,[=](){this->deleteLater();qDebug()<<"SdlShowYuvThread线程结束";});
}SdlShowYuvThread::~SdlShowYuvThread()
{// 断开所有的连接disconnect();// 内存回收之前,正常结束线程requestInterruption();// 安全退出quit();wait();qDebug() << this << "析构(内存被回收)";
}void SdlShowYuvThread::run()
{// 窗口SDL_Window *window = nullptr;// 渲染上下文SDL_Renderer *renderer = nullptr;// 纹理(直接跟特定驱动程序相关的像素数据)SDL_Texture *texture = nullptr;// 文件QFile file(FILENAME);// 初始化子系统END(SDL_Init(SDL_INIT_VIDEO), SDL_Init);// 创建窗口window = SDL_CreateWindow(// 标题"SDL显示YUV图片",// xSDL_WINDOWPOS_UNDEFINED,// ySDL_WINDOWPOS_UNDEFINED,// wIMG_W,// hIMG_H,SDL_WINDOW_SHOWN);END(!window, SDL_CreateWindow);// 创建渲染上下文renderer = SDL_CreateRenderer(window, -1,SDL_RENDERER_ACCELERATED |SDL_RENDERER_PRESENTVSYNC);if (!renderer) {renderer = SDL_CreateRenderer(window, -1, 0);END(!renderer, SDL_CreateRenderer);}// 创建纹理texture = SDL_CreateTexture(renderer,PIXEL_FORMAT,SDL_TEXTUREACCESS_STREAMING,IMG_W, IMG_H);END(!texture, SDL_CreateTexture);// 打开文件if (!file.open(QFile::ReadOnly)) {qDebug() << "file open error" << FILENAME;goto end;}// 将YUV的像素数据填充到textureEND(SDL_UpdateTexture(texture, nullptr, file.readAll().data(), IMG_W),SDL_UpdateTexture);// 设置绘制颜色(画笔颜色)END(SDL_SetRenderDrawColor(renderer,0, 0, 0, SDL_ALPHA_OPAQUE),SDL_SetRenderDrawColor);// 用绘制颜色(画笔颜色)清除渲染目标END(SDL_RenderClear(renderer),SDL_RenderClear);// 拷贝纹理数据到渲染目标(默认是window)END(SDL_RenderCopy(renderer, texture, nullptr, nullptr),SDL_RenderCopy);// 更新所有的渲染操作到屏幕上SDL_RenderPresent(renderer);// 等待退出事件while (!isInterruptionRequested()) {SDL_Event event;SDL_WaitEvent(&event);switch (event.type) {case SDL_QUIT:goto end;}}end:file.close();SDL_DestroyTexture(texture);SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);SDL_Quit();
}

线程调用:

void MainWindow::on_pushButton_sdl_show_yuv_clicked()
{m_pSdlShowYuvThread=new SdlShowYuvThread(this);m_pSdlShowYuvThread->start();
}

注意:.h文件中提前声明了以下全局变量

	SdlShowYuvThread *m_pSdlShowYuvThread=nullptr;

注意:本文为个人记录,新手照搬可能会出现各种问题,请谨慎使用


码字不易,如果这篇博客对你有帮助,麻烦点赞收藏,非常感谢!有不对的地方

相关文章:

十、sdl显示yuv图片

前言 SDL中内置加载BMP的API&#xff0c;使用起来会更加简单&#xff0c;便于初学者学习使用SDL 如果需要加载JPG、PNG等其他格式的图片&#xff0c;可以使用第三方库&#xff1a;SDL_image 测试环境&#xff1a; ffmpeg的4.3.2自行编译版本windows环境qt5.12sdl2.0.22&…...

Docker Nginx容器部署vue项目

Docker Nginx容器部署vue项目 文章目录 Docker Nginx容器部署vue项目1. 前提2. 下载nginx镜像3. 编写nginx.conf配置文件4. 编写构建命令5. vue项目上传 1. 前提 Docker服务已部署 2. 下载nginx镜像 首先查看有没有nginx镜像 docker images没有的情况下再进行下载 docker …...

【深度学习】如何找到最优学习率

经过了大量炼丹的同学都知道&#xff0c;超参数是一个非常玄乎的东西&#xff0c;比如batch size&#xff0c;学习率等&#xff0c;这些东西的设定并没有什么规律和原因&#xff0c;论文中设定的超参数一般都是靠经验决定的。但是超参数往往又特别重要&#xff0c;比如学习率&a…...

详解—C++三大特性——多态

目录 一. 多态的概念 1.1 概念 二. 多态的定义及实现 2.1多态的构成条件 2.2 虚函数 2.3虚函数的重写 2.3.1虚函数重写的两个例外&#xff1a; 1. 协变(基类与派生类虚函数返回值类型不同) 2. 析构函数的重写(基类与派生类析构函数的名字不同) 2.4 C11 override 和 f…...

用idea搭建一个spring cloud微服务项目

以下是使用 IntelliJ IDEA 搭建 Spring Cloud 微服务项目的步骤&#xff1a; 创建一个新的 Maven 项目。 在 pom.xml 文件中添加以下依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-…...

SpringBoot——启动类的原理

优质博文&#xff1a;IT-BLOG-CN SpringBoot启动类上使用SpringBootApplication注解&#xff0c;该注解是一个组合注解&#xff0c;包含多个其它注解。和类定义SpringApplication.run要揭开SpringBoot的神秘面纱&#xff0c;我们要从这两位开始就可以了。 SpringBootApplicati…...

Rust语言入门教程(七) - 所有权系统

所有权系统是Rust敢于声称自己为一门内存安全语言的底气来源&#xff0c;也是让Rust成为一门与众不同的语言的所在之处。也正是因为这个特别的所有权系统&#xff0c;才使得编译器能够提前暴露代码中的错误&#xff0c;并给出我们必要且精准的错误提示。 所有权系统的三个规则…...

【MATLAB源码-第89期】基于matlab的灰狼优化算法(GWO)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;是一种模仿灰狼捕食行为的优化算法。灰狼是群居动物&#xff0c;有着严格的社会等级结构。在灰狼群体中&#xff0c;通常有三个等级&#xff1a;首领&#xff…...

线程池的饱和策略有哪些?

线程池的饱和策略是指当线程池中的任务队列已满时&#xff0c;线程池如何处理新提交的任务。常见的饱和策略有以下几种&#xff1a; 阻塞策略 阻塞策略是指当线程池中的任务队列已满时&#xff0c;新提交的任务会等待队列中有空闲位置后再执行。这种策略可以避免过多的任务被…...

Git设置多个仓库同时推送

Git设置多个仓库同时推送 添加 在Git中&#xff0c;有时我们需要将同一份代码推送到不同的远程仓库&#xff0c;只是URL地址不同。 下面是一种优化的方法来设置多个仓库同时推送&#xff1a; # 添加一个新的远程仓库 git remote set-url --add origin2 新的仓库地址这样&am…...

前端入职环境安装

前端入职 后环境安装 &#xff0c;内函 nodenvmgit微信开发者工具vscode 的安装包 一.node安装-js运行环境 1.node下载&#xff0c;下载地址Node.js 2.配置淘宝镜像 npm config set registry https://registry.npmmirror.com/ 3.查看配置 npm config list 二.nvm安装-切…...

《金融科技行业2023年专利分析白皮书》发布——科技变革金融,专利助力行业发展

金融是国民经济的血脉&#xff0c;是国家核心竞争力的重要组成部分&#xff0c;金融高质量发展成为2023年中央金融工作的重要议题。《中国金融科技调查报告》中指出&#xff0c;我国金融服务业在科技的助力下&#xff0c;从1.0时代的“信息科技金融”、2.0时代的“互联网金融”…...

Introducing the Arm architecture

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 — 适合小白入门【目录】ARMv8/ARMv9架构高级进阶-[目录]👈👈👈 — 高级进阶、小白勿买【加群】ARM/TEE…...

Python 使用SQLAlchemy数据库模块

SQLAlchemy 是用Python编程语言开发的一个开源项目&#xff0c;它提供了SQL工具包和ORM对象关系映射工具&#xff0c;使用MIT许可证发行&#xff0c;SQLAlchemy 提供高效和高性能的数据库访问&#xff0c;实现了完整的企业级持久模型。 ORM&#xff08;对象关系映射&#xff0…...

【nlp】4.3 nlp中常用的预训练模型(BERT及其变体)

nlp中常用的预训练模型 1 当下NLP中流行的预训练模型1.1 BERT及其变体1.2 GPT1.3 GPT-2及其变体1.4 Transformer-XL1.5 XLNet及其变体1.6 XLM1.7 RoBERTa及其变体1.8 DistilBERT及其变体1.9 ALBERT1.10 T5及其变体1.11 XLM-RoBERTa及其变体2 预训练模型说明3 预训练模型的分类1…...

IDEA中 java: 警告: 源发行版 11 需要目标发行版 11 如何解决

步骤1找到项目结构&#xff0c;下面有两种方式 步骤2找到 模块中对应的项目&#xff0c;修改对应的源的语言级别和依赖的模块SDK(M) 步骤3&#xff0c;启动一下&#xff0c;看有无问题&#xff0c; 步骤4&#xff0c;去文件-->设置-->构建、执行、部署-->编译器-->…...

APP测试的测试内容有哪些,常见的Bug分类介绍!

对于产品的手机项目&#xff08;应用软件&#xff09;&#xff0c;主要是进行系统测试。而针对手机应用软件APP的系统测试&#xff0c;我们通常从如下几个角度开展&#xff1a;功能模块测试、兼容性测试、安装和卸载测试、软件更新测试、性能测试、用户体验性测试、交叉事件测试…...

【Java程序员面试专栏 专业技能篇】Java SE核心面试指引(三):核心机制策略

关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第三部分:核心机制策略,子节点表示追问或同级提问 异常处理 …...

网络运维与网络安全 学习笔记2023.11.22

网络运维与网络安全 学习笔记 第二十三天 今日目标 VLAN间通信之交换机、VLAN间通信综合案例、浮动路由 VRRP原理与配置、VRRP链路跟踪、VRRP安全认证 VLAN间通信之交换机 单臂路由的缺陷 在内网的VLAN数量增多时&#xff0c;单臂链路容易成为网络瓶颈 三层交换机 具备…...

Android虚拟化

一、开源项目 开源的项目有一些&#xff0c;比如完全虚拟化的&#xff1a; twoyi 两仪由两部分组成&#xff1a;两仪 App&#xff0c;它实际上是一个 UI 渲染引擎&#xff0c;两仪内部运行的 ROM。 但是看telegram和github&#xff0c;这个app没有完整开源&#xff0c;并且最近…...

如何分析AWR中的Top SQL_通过执行次数与物理读定位低效查询

Top SQL中Executions与Physical Reads需结合分析&#xff1a;执行次数多但物理读低可能暴露应用逻辑缺陷&#xff0c;物理读/执行>1000在OLTP中属异常&#xff0c;需结合执行计划、对象访问、缓存命中率等综合判断根因。怎么看 Top SQL 里的执行次数和物理读是否异常awr 报告…...

消费级GPU福音:百川2-13B-4bits+OpenClaw自动化测试报告

消费级GPU福音&#xff1a;百川2-13B-4bitsOpenClaw自动化测试报告 1. 为什么选择这个组合&#xff1f; 去年冬天&#xff0c;我盯着显卡监控软件里跳动的显存占用数字&#xff0c;突然意识到一个问题&#xff1a;大多数开源大模型对消费级GPU太不友好了。动辄20GB以上的显存…...

从MATLAB到Python:我如何把那个课程大作业的OCR算法“移植”并优化了一遍

从MATLAB到Python&#xff1a;OCR算法迁移与优化的实战指南 第一次用Python重写那个折磨我两周的MATLAB大作业时&#xff0c;我盯着屏幕上完全不同的函数名发愣——原来imbinarize在OpenCV里要拆成threshold加THRESH_OTSU&#xff0c;而曾经熟悉的形态学操作现在要面对getStruc…...

OpenClaw调试技巧:千问3.5-9B接口调用问题排查

OpenClaw调试技巧&#xff1a;千问3.5-9B接口调用问题排查 1. 为什么需要关注接口调用问题 上周我在本地部署OpenClaw对接千问3.5-9B模型时&#xff0c;遇到了一个诡异的问题&#xff1a;明明配置文件正确&#xff0c;模型服务也正常运行&#xff0c;但OpenClaw就是无法完成对…...

FSearch:让Linux文件搜索快到极致的GTK3神器,告别find命令的漫长等待

FSearch&#xff1a;让Linux文件搜索快到极致的GTK3神器&#xff0c;告别find命令的漫长等待 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 还在为Linux系统中查找文…...

[资源管理]:全链路智能化的Manifest协同方案

[资源管理]&#xff1a;全链路智能化的Manifest协同方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 定位核心矛盾&#xff1a;资源管理的系统性困境 在数字内容分发领域&#xff0c;Manife…...

Kubernetes与多集群服务网格实践

Kubernetes与多集群服务网格实践 &#x1f525; 硬核开场 各位技术老铁&#xff0c;今天咱们聊聊Kubernetes与多集群服务网格实践。别跟我扯那些理论&#xff0c;直接上干货&#xff01;在云原生时代&#xff0c;多集群部署已经成为常态&#xff0c;而服务网格是实现多集群服务…...

开源工具SillyTavern:打造个性化AI交互体验的完整指南

开源工具SillyTavern&#xff1a;打造个性化AI交互体验的完整指南 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 在AI对话应用快速发展的今天&#xff0c;寻找一款既能满足高级用户定制需…...

《公安实战:如何实现“目标持续掌控”?》——从“看见目标”到“永不丢失”,空间智能的真实落地

《公安实战&#xff1a;如何实现“目标持续掌控”&#xff1f;》——从“看见目标”到“永不丢失”&#xff0c;空间智能的真实落地在绝大多数公安视频系统里&#xff0c;有一个无法回避的问题&#xff1a;&#x1f449; 人&#xff0c;一定会丢。可能是&#xff1a;转角遮挡换…...

2026年在职研究生论文降AI工具推荐:理论与实践结合部分如何处理

2026年在职研究生论文降AI工具推荐&#xff1a;理论与实践结合部分如何处理 导师发消息说论文AI率超标的时候&#xff0c;我正在食堂吃饭。筷子都差点拿不稳。 后来用了三天时间研究在职研究生论文降AI&#xff0c;踩了不少坑但总算搞定了。最后稳定在用的就是嘎嘎降AI&#…...