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

ffmpeg之显示一个yuv照片

显示YUV图片的步骤

1.初始化SDL库

  • 目的:确保SDL库正确初始化,以便可以使用其窗口、渲染和事件处理功能。
  • 操作:调用 ·SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。

2.创建窗口用于显示YUV图像:

  • 目的:创建一个窗口作为显示YUV图像的目标。
  • 操作:使用 SDL_CreateWindow 创建一个SDL窗口,并指定窗口的位置、大小和标志(如是否全屏等)。你可以根据需要自定义窗口的属性。
  1. 创建渲染器:
  • 目的:创建一个渲染器,用于在窗口中绘制图像。
  • 操作:使用 SDL_CreateRenderer 创建一个渲染器。可以选择硬件加速和垂直同步选项以提高性能和视觉质量。
  1. 读取YUV文件并准备数据:
  • 目的:从YUV文件中读取原始像素数据,并准备好这些数据以便后续处理。
  • 操作:打开YUV文件,读取Y、U、V平面的数据到内存中。这一步骤通常包括分配适当的缓冲区来存储YUV数据。
  1. 创建纹理并设置颜色格式:
  • 目的:创建一个纹理对象,用于在GPU中存储图像数据,并设置纹理的颜色格式(如YUV420P)。
  • 操作:使用 SDL_CreateTexture 创建一个纹理,指定像素格式(例如 SDL_PIXELFORMAT_YV12SDL_PIXELFORMAT_IYUV),以及访问模式(如 SDL_TEXTUREACCESS_STREAMING)。
  1. 将YUV数据更新到纹理:
  • 目的:将读取的YUV数据复制到纹理中,以便可以在渲染时使用。
  • 操作:使用 SDL_UpdateYUVTexture 函数将Y、U、V平面的数据分别更新到纹理中。
  1. 渲染纹理到屏幕上:
  • 目的:将纹理绘制到窗口的渲染层上,完成图像的显示。
  • 操作:调用 SDL_RenderClear 清除渲染目标,然后使用 SDL_RenderCopy 将纹理复制到渲染器的目标区域,最后调用 SDL_RenderPresent 刷新屏幕以显示图像。
  1. 处理事件和清理资源:
  • 目的:处理用户输入或事件,并释放所有分配的资源。
  • 操作:使用 SDL_PollEvent 处理事件(如关闭窗口),并在程序结束时调用相应的销毁函数(如 SDL_DestroyTexture、SDL_DestroyRenderer 和 SDL_DestroyWindow),最后调用 SDL_Quit 退出SDL库。

代码用例:

void playThread::run()
{//创建窗口SDL_Window *window = nullptr;//渲染上下文SDL_Renderer *renderer = nullptr;//纹理(直接跟特定驱动程序相关的像素数据)SDL_Texture *texture = nullptr;//文件QFile file(FILENAME);//初始化子系统END(SDL_Init(SDL_INIT_VIDEO),SDL_Init);//创建一个窗口//标题-X-Y-width-heightwindow = SDL_CreateWindow("SDL显示YUV图片",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,IMG_W,IMG_H,SDL_WINDOW_SHOWN);END(!window,SDL_CreateWindow);//创建渲染上下文--用于渲染图形到窗口//这SDL_RENDERER_ACCELERATED -- 个标志告诉 SDL 尝试创建一个使用硬件加速的渲染器//SDL_RENDERER_PRESENTVSYNC -- 这个标志使渲染器的呈现操作同步到显示器的垂直同步(VSync)renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);//如果创建失败if(!renderer){renderer = SDL_CreateRenderer(window,-1,0);END(!renderer,SDL_CreateRenderer);}//创建纹理ttexture = SDL_CreateTexture(renderer,PIXEL_FORMAT,SDL_TEXTUREACCESS_STREAMING,IMG_W,IMG_H);END(!texture,SDL_CreateTextureFromSurface);//打开YUV文件if(!file.open(QFile::ReadOnly)){qDebug() << "file open error" << FILENAME;goto end;}//将YUV的像素数据填充到texture -- nullptr空表示整个texture都是END(SDL_UpdateTexture(texture,nullptr,file.readAll().data(),IMG_W),SDL_UpdateTexture);//设置绘制颜色(画笔颜色)SDL_SetRenderDrawColor(renderer,0,0,0,SDL_ALPHA_OPAQUE);//用绘制颜色(画笔颜色)清除渲染目标---也就是覆盖SDL_RenderClear(renderer);//拷贝纹理数据到渲染目标(默认时window)END(SDL_RenderCopy(renderer,texture,nullptr,nullptr),SDL_RenderCopy);//更新所有的渲染操作到屏幕上SDL_RenderPresent(renderer);SDL_Delay(2000);end:file.close();SDL_DestroyRenderer(renderer);SDL_DestroyTexture(texture);SDL_DestroyWindow(window);SDL_Quit();//初始化子系统后必须做一个退出操作
}

用例输出图:
在这里插入图片描述

如何自定义显示窗口呢?

首先我们在create窗口的时候,我们可以通过winId来设置的它的显示窗口,如下例子所示:

在进行点击按钮显示的时候,将显示窗口目标的winId传给create窗口。

void MainWindow::on_pushButton_clicked()
{//playThread * pt = new playThread((void *)ui->label->winId(),this);playThread * pt = new playThread((void *)_widget->winId(),this);pt->start();}
oid playThread::run()
{//创建窗口SDL_Window *window = nullptr;//渲染上下文SDL_Renderer *renderer = nullptr;//纹理(直接跟特定驱动程序相关的像素数据)SDL_Texture *texture = nullptr;//文件QFile file(FILENAME);//初始化子系统END(SDL_Init(SDL_INIT_VIDEO),SDL_Init);//创建一个窗口//标题-X-Y-width-heightwindow = SDL_CreateWindowFrom(_winId);END(!window,SDL_CreateWindow);//创建渲染上下文--用于渲染图形到窗口//这SDL_RENDERER_ACCELERATED -- 个标志告诉 SDL 尝试创建一个使用硬件加速的渲染器//SDL_RENDERER_PRESENTVSYNC -- 这个标志使渲染器的呈现操作同步到显示器的垂直同步(VSync)renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);//如果创建失败if(!renderer){renderer = SDL_CreateRenderer(window,-1,0);END(!renderer,SDL_CreateRenderer);}//创建纹理ttexture = SDL_CreateTexture(renderer,PIXEL_FORMAT,SDL_TEXTUREACCESS_STREAMING,IMG_W,IMG_H);END(!texture,SDL_CreateTextureFromSurface);//打开YUV文件if(!file.open(QFile::ReadOnly)){qDebug() << "file open error" << FILENAME;goto end;}//将YUV的像素数据填充到texture -- nullptr空表示整个texture都是END(SDL_UpdateTexture(texture,nullptr,file.readAll().data(),IMG_W),SDL_UpdateTexture);//设置绘制颜色(画笔颜色)SDL_SetRenderDrawColor(renderer,0,0,0,SDL_ALPHA_OPAQUE);//用绘制颜色(画笔颜色)清除渲染目标---也就是覆盖SDL_RenderClear(renderer);//拷贝纹理数据到渲染目标(默认时window)END(SDL_RenderCopy(renderer,texture,nullptr,nullptr),SDL_RenderCopy);//更新所有的渲染操作到屏幕上SDL_RenderPresent(renderer);SDL_Delay(2000);end:file.close();SDL_DestroyRenderer(renderer);SDL_DestroyTexture(texture);SDL_DestroyWindow(window);SDL_Quit();//初始化子系统后必须做一个退出操作
}

用例输出图:
在这里插入图片描述

相关文章:

ffmpeg之显示一个yuv照片

显示YUV图片的步骤 1.初始化SDL库 目的&#xff1a;确保SDL库正确初始化&#xff0c;以便可以使用其窗口、渲染和事件处理功能。操作&#xff1a;调用 SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。 2.创建窗口用于显示YUV图像&#xff1a; 目的&#xff1a;创建一个…...

MySQL中Performance Schema库的详解(下)

昨天说了关于SQL语句相关的&#xff0c;今天来说说性能相关的&#xff0c;如果没有看过上篇请点传送门https://blog.csdn.net/2301_80479959/article/details/144693574?fromshareblogdetail&sharetypeblogdetail&sharerId144693574&sharereferPC&sharesource…...

【Rust自学】7.1. Package、Crate和定义Module

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.1.1. Rust的代码组织 代码组织主要包括&#xff1a; 那些细节可以对外暴露&#xff0c;而哪些细节是私有的在作用域内哪些名称有效… …...

【Git】-- 版本说明

Alpha&#xff1a;是内部测试版,一般不向外部发布,会有很多 Bug .一般只有测试人员使用。Beta&#xff1a;也是测试版&#xff0c;这个阶段的版本会一直加入新的功能。在 Alpha 版之后推出。RC&#xff1a;(Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台…...

1919C. Grouping Increases

问题描述 序列 X X X&#xff0c;划分成两个字序列 A , B A,B A,B&#xff0c;其中惩罚是 A , B A,B A,B之中&#xff0c; A [ i ] < A [ i 1 ] , B [ i ] < B [ i 1 ] A[i] < A[i1], B[i] < B[i1] A[i]<A[i1],B[i]<B[i1]的个数 思路 拆分 X X X&#xf…...

Pion WebRTC 项目教程

Pion WebRTC 项目教程 webrtc Pure Go implementation of the WebRTC API [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/we/webrtc 1. 项目目录结构及介绍 Pion WebRTC 项目的目录结构如下&#xff1a; pion/webrtc ├── api ├── examples ├── inter…...

【安全编码】Web平台如何设计防止重放攻击

我们先来做一道关于防重放的题&#xff0c;答案在文末 防止重放攻击最有效的方法是&#xff08; &#xff09;。 A.对用户密码进行加密存储使用 B.使用一次一密的加密方式 C.强制用户经常修改用户密码 D.强制用户设置复杂度高的密码 如果这道题目自己拿不准&#xff0c;或者…...

VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)

网址连接&#xff1a;http://118.25.110.213:5200/#/login 账号/密码&#xff1a;renxiaoyong 1、VUE3部署本地。 1.1本地安装部署node.js 1.2安装vue脚手架 npm install -g vue/cli # 或者 yarn global add vue/cli1.3创建本地项目 vue create my-vue-project1.4安装依赖和插…...

Python爬虫(入门+进阶)

简介 围绕 Python 爬虫展开&#xff0c;包括四个章节。第一章从 Python 爬虫入门&#xff0c;涵盖爬虫概念、Requests 爬取、Xpath 解析、数据保存及入库等知识&#xff0c;并结合知乎、豆瓣、淘宝等案例讲解浏览器抓包及 Selenium 爬取动态网页。第二章介绍 Scrapy 框架&…...

保姆级教程Docker部署RabbitMQ镜像

目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行RabbitMQ容器 4、Compose运行RabbitMQ容器 5、开启界面插件 6、查看RabbitMQ运行状态 7、常见问题处理 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考&#xff1a;Ubuntu上安装 Docker及可视化管理…...

【RAII | 设计模式】C++智能指针,内存管理与设计模式

前言 nav2系列教材&#xff0c;yolov11部署,系统迁移教程我会放到年后一起更新&#xff0c;最近年末手头事情多&#xff0c;还请大家多多谅解。 上一节我们讲述了C移动语义相关的知识&#xff0c;本期我们来看看C中常用的几种智能指针&#xff0c;并看看他们在设计模式中的运…...

Linux复习3——管理文件系统2

修改文件权限命令 chmod 功能&#xff1a; chmod 命令主要用于修改文件或者目录的权限 只有文件所有者和超级用户可以修改文件或目录的权限 (1)使用数字表示法修改权限 所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以4、2、1来表示&#xff0c;没有授予的部分就表示…...

c++---------数据类型

基本数据类型 整数类型&#xff08;Integral Types&#xff09; int&#xff08;整型&#xff09; 这是最常用的整数类型&#xff0c;通常用于存储一般范围的整数值。在32位系统中&#xff0c;int类型一般占用4个字节&#xff0c;取值范围大约是 - 2147483648到2147483647。例如…...

前端Python应用指南(三)Django vs Flask:哪种框架适合构建你的下一个Web应用?

《写给前端的python应用指南》系列&#xff1a; &#xff08;一&#xff09;快速构建 Web 服务器 - Flask vs Node.js 对比&#xff08;二&#xff09;深入Flask&#xff1a;理解Flask的应用结构与模块化设计 在上一篇博文中&#xff0c;我们深入探讨了Flask框架&#xff0c;…...

鸿蒙系统文件管理基础服务的设计背景和设计目标

有一定经验的开发者通常对文件管理相关的api应用或者底层逻辑都比较熟悉&#xff0c;但是关于文件管理服务的设计背景和设计目标可能了解得不那么清楚&#xff0c;本文旨在分享文件管理服务的设计背景及目标&#xff0c;方便广大开发者更好地理解鸿蒙系统文件管理服务。 1 鸿蒙…...

要查询 `user` 表中 `we_chat_open_id` 列不为空的用户数量

要查询 user 表中 we_chat_open_id 列不为空的用户数量&#xff0c;你可以使用以下 SQL 查询语句&#xff1a; SELECT COUNT(*) FROM user WHERE we_chat_open_id IS NOT NULL AND we_chat_open_id ! ;解释&#xff1a; SELECT COUNT(*): 表示要计算符合条件的行数。FROM us…...

AI科研助手开发总结:向量与数据权限的应用(二)

一、前言 继上篇文章&#xff1a;AI科研助手开发总结&#xff1a;向量与数据权限的应用&#xff08;一&#xff09; 本章根据向量库内存储数据及权限&#xff0c;向量库统一维护和管理数据权限方案讨论。 二、方案分析-基于向量Fields 2.1 思路 结合橙语AI科研助手的业务场…...

python爬虫----爬取视频实战

python爬虫-爬取视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入此网站中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到后续我们想要…...

HarmonyOS NEXT 实战之元服务:静态案例效果--航空出行

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …...

DP83848以太网移植流程,可以TCP通信

DP83848-EP 是一款高度可靠、功能丰富的强大器件,包含了增强型 ESD 保护、MII 和 RMII,从而在 MPU 选择方面实现最大的灵活性,所有这些特性都融入于 48 引脚 PQFP 封装中。 DP83848-EP 配备 集成子层以支持 10BASE-T 和 100BASE-TX 以太网协议,这些协议确保了与基于其他标…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...