ffmpeg之播放一个yuv视频
播放YUV视频的步骤
- 初始化SDL库:
- 目的:确保SDL库正确初始化,以便可以使用其窗口、渲染和事件处理功能。
- 操作:调用
SDL_Init(SDL_INIT_VIDEO)来初始化SDL的视频子系统。
- 创建窗口用于显示YUV视频:
目的:创建一个窗口作为显示YUV视频的目标。
操作:使用SDL_CreateWindow创建一个SDL窗口,并指定窗口的位置、大小和标志(如是否全屏等)。你可以根据需要自定义窗口的属性。 - 创建渲染器:
- 目的:创建一个渲染器,用于在窗口中绘制图像。
- 操作:使用
SDL_CreateRenderer创建一个渲染器。可以选择硬件加速和垂直同步选项以提高性能和视觉质量。
- 创建纹理并设置颜色格式:
- 目的:创建一个纹理对象,用于在GPU中存储图像数据,并设置纹理的颜色格式(如YUV420P)。
- 操作:使用
SDL_CreateTexture创建一个纹理,指定像素格式(例如SDL_PIXELFORMAT_YV12 或 SDL_PIXELFORMAT_IYUV),以及访问模式(如SDL_TEXTUREACCESS_STREAMING)。
- 循环读取YUV文件并更新纹理:
- 目的:从YUV文件中逐帧读取原始像素数据,并将每一帧的数据更新到纹理中,完成每一帧的渲染。
- 操作:在一个循环中读取YUV文件中的每一帧数据,使用
SDL_UpdateYUVTexture将Y、U、V平面的数据分别更新到纹理中,然后调用SDL_RenderClear、SDL_RenderCopy和SDL_RenderPresent来刷新屏幕以显示当前帧。确保每帧之间有适当的延时以维持正确的播放速度。
- 清理资源:
目的:释放所有分配的资源,确保没有内存泄漏。
操作:在程序结束时调用相应的销毁函数(如 SDL_DestroyTexture、SDL_DestroyRenderer 和 SDL_DestroyWindow),最后调用 SDL_Quit 退出SDL库。
示例代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <SDL2/SDL.h>
#include <QDebug>
#include <QFile>#define RET(judge,SDL_Init) \if(judge) \{\qDebug() << #SDL_Init << "error" << SDL_GetError();\return;\}
#define FILENAME "D:/ffmpeg/in.yuv"
#define PIXEL_FORMAT SDL_PIXELFORMAT_IYUV
#define IMG_W 352
#define IMG_H 288MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);_widget = new QWidget(this);//设置窗口位置和大小_widget->setGeometry(100,0,IMG_W,IMG_H);//初始化子系统RET(SDL_Init(SDL_INIT_VIDEO),SDL_Init);//创建一个窗口//标题-X-Y-width-height_window = SDL_CreateWindowFrom((void *)_widget->winId());RET(!_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);RET(!_renderer,SDL_CreateRenderer);}//创建纹理t_texture = SDL_CreateTexture(_renderer,PIXEL_FORMAT,SDL_TEXTUREACCESS_STREAMING,IMG_W,IMG_H);RET(!_texture,SDL_CreateTextureFromSurface);//打开YUV文件_file.setFileName(FILENAME);if(!_file.open(QFile::ReadOnly)){qDebug() << "_file open error" << FILENAME;return;}
}MainWindow::~MainWindow()
{delete ui;_file.close();SDL_DestroyRenderer(_renderer);SDL_DestroyTexture(_texture);SDL_DestroyWindow(_window);SDL_Quit();//初始化子系统后必须做一个退出操作
}void MainWindow::on_pushButton_clicked()
{//开启定时器_timerId = startTimer(60);}//每隔一段事件就会调用
void MainWindow::timerEvent(QTimerEvent *enent)
{int imgSize = IMG_W * IMG_H * 1.5;char data[imgSize];if(_file.read(data,imgSize) > 0){//将YUV的像素数据填充到texture -- nullptr空表示整个texture都是RET(SDL_UpdateTexture(_texture,nullptr,data,IMG_W),SDL_UpdateTexture);//设置绘制颜色(画笔颜色)SDL_SetRenderDrawColor(_renderer,0,0,0,SDL_ALPHA_OPAQUE);//用绘制颜色(画笔颜色)清除渲染目标---也就是覆盖SDL_RenderClear(_renderer);//拷贝纹理数据到渲染目标(默认时window)RET(SDL_RenderCopy(_renderer,_texture,nullptr,nullptr),SDL_RenderCopy);//更新所有的渲染操作到屏幕上SDL_RenderPresent(_renderer);}else{//文件数据已经读取完毕killTimer(_timerId);}}
由于是一个视频,所以只截取了一个照片

相关文章:
ffmpeg之播放一个yuv视频
播放YUV视频的步骤 初始化SDL库: 目的:确保SDL库正确初始化,以便可以使用其窗口、渲染和事件处理功能。操作:调用 SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。 创建窗口用于显示YUV视频: 目的:…...
《2023-2024网络安全产业发展核心洞察与趋势预测》
2023年至2024年间,我国经济总体上逐步显现出复苏迹象,并开始释放向上增长的潜力。在此背景下,网络安全产业也经历了经济环境的深刻影响,不仅实现了阶段性的稳定发展,也展现出较强的韧性与适应能力,为未来的…...
为什么环境影响评价导则中生态环境评价中的【植被类型图】制作比较难?制作流程是什么
最新《环境影响评价技术导则生态影响HJ19—2022》于2022年1月15日发布,2022-07-01正式实施,新导则颁布后,要求生态现状评价内容中基本图件构成包含:项目区域地理位置图、工程平面图、调查样方、样线、点位、断面等布设图、土地利用…...
肿瘤电场治疗费用
肿瘤电场治疗作为一种前沿的肿瘤治疗方法,近年来备受关注。该方法通过利用特定频率的交流电场,作用于恶性肿瘤细胞,以达到抑制肿瘤生长的目的。然而,随着这种治疗方法的普及,其费用问题也逐渐成为患者和家属关注的焦点…...
替换 Docker.io 的 Harbor 安全部署指南:域名与 IP 双支持的镜像管理解决方案
经过验证 替换 Docker.io 的方式失败了, 以下的过程中还是需要设置 registry-mirrors 才行 以下是一篇详细教程,展示如何基于 openssl.conf 配置生成域名为 registry-1.docker.io 和 IP 地址为 172.16.20.20 的证书,构建 Harbor 服务。 环境准备 系统环境…...
Python知识图谱框架
Python中用于构建知识图谱的框架和库有很多,它们各自有不同的特点和功能,适用于不同的应用场景。以下是一些常用的框架: 1. NetworkX 功能:NetworkX是一个用于创建、操作和研究复杂网络的Python库。它可以用于构建知识图谱&…...
elasticsearch 杂记
8.17快速安装与使用 系统:ubuntu 24 下载地址: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.0-linux-x86_64.tar.gz 解压后进入目录:cd ./elasticsearch-8.17.0 运行:./bin/elasticsearch 创…...
Text2Reward学习笔记
1. 环境配置 1.1 安装 PyTorch-1.13.1 pip install torch1.13.1cu116 torchvision0.14.1cu116 \ torchaudio0.13.1 --extra-index-url https://download.pytorch.org/whl/cu1161.2 安装工具库 pip install stable-baselines31.8.0 wandb tensorboard \ -i https://pypi.tuna…...
KylinOS V10 SP3下编译openGauss与dolphin插件
编译环境 KylinOS v10 sp3gcc 7.3.0make 4.3opengauss 5.0.0 mkdir -p /data/opengauss cd /data/opengauss git clone https://gitee.com/opengauss/openGauss-server.git git clone https://gitee.com/opengauss/Plugin.git wget -c https://opengauss.obs.cn-south-1.myhu…...
NPM老是无法install,timeout?npm install失败
NPM老是无法install,timeout? 尝试一下如下操作 一、 更换国内源 npm config set registry https://registry.npmmirror.com npm install或指定源install npm install pkg --registry https://registry.npmmirror.com --legacy-peer-deps如下图 二…...
安卓project级别build.gradle和主module的build.gradle
以穿山甲为例讲解 如下图 gradle和gradle插件对应关系 Android Gradle 插件 8.7 版本说明 | Android Studio | Android Developers gradle对应在项目里的配置为 gradle插件对应的位置为...
大模型(LLM)提示工程(Prompt Engineering)初识
大模型提示工程(Prompt Engineering)是指设计和优化给定任务的输入提示,以便从大型语言模型(如GPT-4、GPT-3等)中获得最佳输出。其核心目标是通过合理设计输入内容(提示词或提示结构)࿰…...
大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop࿰…...
gaussian_splatting 构建submodules的diff-gaussian-rasterization失败报错
c:\program files\nvidia gpu computing toolkit\cuda\v11.8\include\crt/host_config.h(231): fatal error C1083: 无法打开包括文件: “crtdefs.h”: No such file or directory 配置: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin\nvcc.profil…...
template<typename Func, typename = void> 在类模板中的应用
1、基础语法 在 C 中,template<typename Func, typename void> 这一模板声明不仅仅限于函数模板,它在类模板中同样具有强大的应用。结合 SFINAE(Substitution Failure Is Not An Error)和 类型特征(type trait…...
如何确保数据大屏的交互设计符合用户需求?(附实践资料下载)
确保数据大屏的交互设计符合用户需求是一个多步骤的过程,涉及到用户研究、设计原则、原型测试和持续迭代。以下是一些关键步骤和策略: 用户研究: 目标用户识别:明确大屏的目标用户群体,包括他们的背景、角色和需求。用…...
Linux使用教程及常用命令大全
Linux是一个开源的操作系统,具有高度的可定制性和可扩展性。以下是一份 Linux 使用教程及常用命令的总结,帮助你快速入门 Linux。 1. 安装 Linux 下载 Linux 安装程序(可参考我的这篇文章):VMware虚拟机超详细安装Linu…...
基于openlayers 开发vue地图组件
先看效果 主要功能如下: 测量图源更换放大缩小地图添加点hover点数据切换到地图位置;也设定层级2D3D切换,3D为cesium开发,技术交流可以加V:bloxed 地图工具做了插槽,分为toolbar(左上角工具…...
音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现
音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…...
【C++】B2069 求分数序列和题目解析与优化详解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式输出格式输入输出样例输入:输出: 💯解题思路分析题目解题步骤 💯代码实现我的代码实现实现特点 老师的代码…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
