ffmpeg之播放一个yuv视频

播放YUV视频的步骤

  1. 初始化SDL库:
  • 目的:确保SDL库正确初始化,以便可以使用其窗口、渲染和事件处理功能。
  • 操作:调用 SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。
  1. 创建窗口用于显示YUV视频:
    目的:创建一个窗口作为显示YUV视频的目标。
    操作:使用 SDL_CreateWindow 创建一个SDL窗口,并指定窗口的位置、大小和标志(如是否全屏等)。你可以根据需要自定义窗口的属性。
  2. 创建渲染器:
  • 目的:创建一个渲染器,用于在窗口中绘制图像。
  • 操作:使用 SDL_CreateRenderer 创建一个渲染器。可以选择硬件加速和垂直同步选项以提高性能和视觉质量。
  1. 创建纹理并设置颜色格式:
  • 目的:创建一个纹理对象,用于在GPU中存储图像数据,并设置纹理的颜色格式(如YUV420P)。
  • 操作:使用 SDL_CreateTexture 创建一个纹理,指定像素格式(例如 SDL_PIXELFORMAT_YV12 或 SDL_PIXELFORMAT_IYUV),以及访问模式(如 SDL_TEXTUREACCESS_STREAMING)。
  1. 循环读取YUV文件并更新纹理:
  • 目的:从YUV文件中逐帧读取原始像素数据,并将每一帧的数据更新到纹理中,完成每一帧的渲染。
  • 操作:在一个循环中读取YUV文件中的每一帧数据,使用 SDL_UpdateYUVTexture 将Y、U、V平面的数据分别更新到纹理中,然后调用 SDL_RenderClearSDL_RenderCopySDL_RenderPresent 来刷新屏幕以显示当前帧。确保每帧之间有适当的延时以维持正确的播放速度。
  1. 清理资源:
    目的:释放所有分配的资源,确保没有内存泄漏。
    操作:在程序结束时调用相应的销毁函数(如 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);}}

由于是一个视频,所以只截取了一个照片
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/495387.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL索引为什么是B+树

MySQL索引为什么是B树 索引是帮助MySQL高效获取数据的数据结构&#xff0c;在数据之外&#xff0c;数据库还维护着满足特定查找算法的数据结构B树&#xff0c;这些数据结果以某种特定的方式引用数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;提升数据…

打造高效租赁小程序让交易更便捷

内容概要 在如今节奏飞快的商业世界里&#xff0c;租赁小程序如同一只聪明的小狐狸&#xff0c;迅速突围而出&#xff0c;成为商家与消费者之间的桥梁。它不仅简化了交易流程&#xff0c;还在某种程度上将传统租赁模式带入了互联网时代。越来越多的企业意识到&#xff0c;这种…

抓取手机HCI日志

荣耀手机 1、打开开发者模式 2、开启HCI、ADB调试 3、开启AP LOG 拨号界面输入*##2846579##* 4、蓝牙配对 5、抓取log adb pull /data/log/bt ./

GPT人工智能在医疗文档中的应用

应用场景 用于文档的整理。主要是针对医疗方面的文档整理。病人在打官司或者办理其他业务时&#xff0c;需要把很多文档整理成册并添加目录、编写概要&#xff08;Summary&#xff09;。这些文档有电子版本的&#xff0c;有纸质的扫描件&#xff0c;还有拍照&#xff08;一般是…

GitCode 光引计划投稿 | GoIoT:开源分布式物联网开发平台

GoIoT 是基于Gin 的开源分布式物联网&#xff08;IoT&#xff09;开发平台&#xff0c;用于快速开发&#xff0c;部署物联设备接入项目&#xff0c;是一套涵盖数据生产、数据使用和数据展示的解决方案。 GoIoT 开发平台&#xff0c;它是一个企业级物联网平台解决方案&#xff…

golang 并发--goroutine(四)

golang 语言最大的特点之一就是语法上支持并发&#xff0c;通过简单的语法很容易就能创建一个 go 程&#xff0c;这就使得 golang 天生适合写高并发的程序。这一章节我们就主要介绍 go 程&#xff0c;但是要想完全理解 go 程我们需要深入研究 GPM 模型&#xff0c;关于 GPM 模型…

选择FPGA开发,学历是硬性要求吗?

在踏入FPGA开发领域之前&#xff0c;心中难免会泛起的疑虑。 选择FPGA开发&#xff0c;就一定需要高学历作为支撑吗&#xff1f; 一、先说结论&#xff1a;学历非必需&#xff0c;但建议不断提升自我。 FPGA开发的门槛意味着你需要投入比其他行业更多的时间和精力去学习&…

面试场景题系列:设计一致性哈希系统

为了实现横向扩展&#xff0c;在服务器之间高效和均匀地分配请求/数据是很重要的。一致性哈希是为了达成这个目标而被广泛使用的技术。首先&#xff0c;我们看一下什么是重新哈希问题。 1 重新哈希的问题 如果你有n个缓存服务器&#xff0c;常见的平衡负载的方法是使用如下哈希…

778-批量删除指定文件夹下指定格式文件(包含子孙文件夹下的)

778-批量删除指定文件夹下指定格式文件&#xff08;包含子孙文件夹下的&#xff09; 批量删除指定文件夹下所有指定格式文件&#xff0c;包括子孙文件夹下 文件扩展名输入时一行一个&#xff0c;可以同时删除多个格式文件&#xff0c; 输入格式是可以带.也可以不带&#xff…

MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式)

MarkItDown的使用&#xff08;将Word、Excel、PDF等转换为Markdown格式&#xff09; 本文目录&#xff1a; 零、时光宝盒&#x1f33b; 一、简介 二、安装 三、使用方法 3.1、使用命令行形式 3.2、用 Python 调用 四、总结 五、参考资料 零、时光宝盒&#x1f33b; &a…

数字工厂管理系统就是ERP系统吗

在制造业数字化转型的进程中&#xff0c;数字工厂管理系统与ERP系统常常被提及&#xff0c;不少人疑惑这两者是否为同一概念。事实上&#xff0c;它们虽有联系&#xff0c;却存在诸多显著差异。 ERP系统&#xff0c;即企业资源计划系统&#xff0c;其核心在于对企业全方位资源的…

【Linux】Linux开发利器:make与Makefile自动化构建详解

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器 在现代软件开发中&#xff0c;自动化构建工具显得尤为重要&#xff0c;make和Makefile是Linux环境下的常用选择。它们通过定义规则和依赖关系&#…

【MinIO系列】MinIO Client (mc) 完全指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

在跨平台开发环境中构建高效的C++项目:从基础到最佳实践20241225

在跨平台开发环境中构建高效的C项目&#xff1a;从基础到最佳实践 引言 在现代软件开发中&#xff0c;跨平台兼容性和高效开发流程是每个工程师追求的目标。尤其是对于 C 开发者&#xff0c;管理代码的跨平台构建以及调试流程可能成为一项棘手的挑战。在本文中&#xff0c;我…

2. SQL窗口函数使用

背景 窗口函数也叫分析函数&#xff0c;主要用于处理相对复杂的报表统计分析场景&#xff0c;这个功能在大多商业数据库和部分开源数据库中已经支持&#xff0c;mysql从8.0开始支持窗口函数。经典使用场景是数据错位相减的场景&#xff0c;比如求查询每年支付时间间隔最长的用…

Qt creator ,语言家功能缺失解决方法

1、找到工具->外部->配置 2、添加目录&#xff0c;双击命名语言家 3、在语言家目录下&#xff0c;添加工具 双击重命名lupdate&#xff0c;即更新翻译 %{CurrentDocument:Project:QT_INSTALL_BINS}\lupdate%{CurrentDocument:Project:FilePath}%{CurrentDocument:Projec…

软件测试之全链路压测详解

随着业务的快速发展我们日常遇到的系统性能压力问题也逐渐出现&#xff0c;甚至在部分场合会遇到一些突发的营销活动&#xff0c;会导致系统性能突然暴涨&#xff0c;可能导致我们系统的瘫痪。最近几年随着电商的各种促销活动&#xff0c;有一个词也渐渐进入我们眼帘&#xff0…

基于推理的目标检测 DetGPT

基于推理的目标检测 DetGPT flyfish detgpt.github.io 近年来&#xff0c;由于大型语言模型&#xff08;LLMs&#xff09;的发展&#xff0c;计算机视觉领域取得了重大进展。这些模型使人类与机器之间能够进行更有效、更复杂的交互&#xff0c;为模糊人类与机器智能界限的新技…

优化 invite_codes 表的 SQL 创建语句

-- auto-generated definition create table invite_codes (id int auto_incrementprimary key,invite_code varchar(6) not null comment 邀请码&#xff0c;6位整数&#xff0c;确保在有效期内…

如何在 Ubuntu 22.04 上安装以及使用 MongoDB

简介 MongoDB 因其灵活性、可扩展性、性能和生态系统而受到开发人员的青睐&#xff0c;这些都是构建和驱动现代应用程序的关键能力。通过几个配置步骤&#xff0c;你就可以在你的 Ubuntu 22.04 LTS 机器上安装 MongoDB&#xff0c;这是 Ubuntu Linux 发行版的最新长期支持版本…