Qt+SDL播放YUV视频文件

2023-11-13

播放一个yuv420p格式的文件
yuv的格式与rgb格式的存储方式不同
yuv数据是 yyyyyyyy uu vv 的存储
rgb是rgba rgba rgba 存储
同样一帧图像 yuv420会比rgb数据更小
读取时就要注意数据存储格式不同,数据大小也不同
直接上代码
sdl_qt_play_yuv.h

#include <QtWidgets/QWidget>
#include <SDL2/SDL.h>
#include <fstream>
#include "ui_sdl_qt_play_yuv.h"

class sdl_qt_play_yuv : public QWidget
{
    Q_OBJECT

public:
    sdl_qt_play_yuv(QWidget *parent = Q_NULLPTR);
    void timerEvent(QTimerEvent* ev) override;

private:
    Ui::sdl_qt_rgbClass ui;
    SDL_Window* sdl_window;
    SDL_Renderer* sdl_render;
    SDL_Texture* sdl_texture;
    unsigned char* yuv_data;
    std::ifstream yuv_file;
};

sdl_qt_play_yuv.cpp

#include "sdl_qt_play_yuv.h"
#include <QMessageBox>
#include <QDebug>
#define PIX_SIZE 2
#pragma comment(lib, "SDL2.lib")
void sdl_qt_play_yuv::timerEvent(QTimerEvent* ev)
{
    yuv_file.read((char*)yuv_data, ui.label->width() * ui.label->height()*1.5);//一帧图像的yuv420的数据量就是像素的1.5倍
    //数据复制到材质 yuv平面存储 yyyyyyyy  uu  vv
    SDL_UpdateTexture(sdl_texture, nullptr, yuv_data, ui.label->width());
    SDL_RenderClear(sdl_render);
    //材质写入渲染
    SDL_Rect sdl_rect;
    sdl_rect.x = 0;
    sdl_rect.y = 0;
    sdl_rect.w = ui.label->width();
    sdl_rect.h = ui.label->height();
    SDL_RenderCopy(sdl_render, sdl_texture,
        nullptr,//原图位置和尺寸
        &sdl_rect//目标位置和尺寸
    );
    //开始渲染
    SDL_RenderPresent(sdl_render);
    if (yuv_file.eof()) {
        yuv_file.clear();
        yuv_file.seekg(0);
    }    
}
sdl_qt_play_yuv::sdl_qt_play_yuv(QWidget *parent)
    : QWidget(parent)
{
    yuv_file.open("input.yuv", std::ios_base::binary);//打开一个400*300的yuv视频文件
    if (!yuv_file) {
        QMessageBox::information(this, "", "open yuv failed!");
        return;
    }
    ui.setupUi(this);
    ui.label->resize(400, 300);//yuv文件并没有视频的宽高数据, 这里手动指定

    SDL_Init(SDL_INIT_VIDEO);
    //创建窗口
    sdl_window = SDL_CreateWindowFrom((void*)ui.label->winId());
    if (!sdl_window) {
        exit(-1);
    }
    //创建渲染器
    sdl_render = SDL_CreateRenderer(sdl_window, -1, SDL_RENDERER_ACCELERATED);
    if (!sdl_render) {
        exit(-2);
    }
    //创建材质 设置成支持yuv格式
    sdl_texture = SDL_CreateTexture(sdl_render,
        SDL_PIXELFORMAT_IYUV,
        SDL_TEXTUREACCESS_STREAMING,
        ui.label->width(),
        ui.label->height());
    if (!sdl_texture) {
        exit(-3);
    }
    //清屏
    SDL_RenderClear(sdl_render);
    
    yuv_data = new unsigned char[ui.label->width() * ui.label->height() * PIX_SIZE];
    startTimer(5);//利用定时器粗略控制帧率
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt+SDL播放YUV视频文件 的相关文章

  • 中国首家!腾讯云入选Gartner®视频平台服务市场指南代表厂商

    近日 Gartner正式发布 Market Guide for Video Platform Services 视频平台服务市场指南 下称 指南 凭借领先的音视频技术和产品组合优势 腾讯云成为中国首家且唯一入选的代表厂商 腾讯云VPS一站式
  • 音频转换mp3格式软件哪个好?下面推荐几款好用的软件给你

    你是否曾经遇到过这样的情况 下载了大量音频文件 却因为文件格式受到限制 而无法直接在设备上播放 不用担心 今天我将向大家介绍几款能把音频转换mp3的软件 它们可以帮助我们有效地解决音频格式不兼容的问题 一 专业的音频处理软件 优点1 简单易
  • Shared_ptr 自定义删除器

    我需要为shared ptr 做自定义删除器 我知道这可以通过类似的方式完成 std shared ptr
  • SDL 中的 Blit 是什么?

    在 SDL wiki 中它说 使用此函数可以执行从源表面到目标表面的快速 blit 但这对我没有多大帮助 在这种情况下 术语 表面位块传输 是什么意思 基本上 这意味着将图像从一个表面复制到另一个表面 可能会被裁剪和移动
  • 在 OS X 上加载表面时,SDL2 预乘 alpha 通道?

    我正在通过 OS X Sierra 上的 SDL2 2 0 7 和 SDL2 image 2 0 2 加载 32 位 RGBA 法线贴图纹理 并在 Alpha 通道中编码高度图 这些纹理中的每个像素都有一个非零 RGB 值 编码方向法向量
  • 如何避免 Linux/X11 上的 pygame 撕裂

    我一直在玩 pygame 在 Debian Lenny 上 它似乎工作得很好 除了烦人的位图撕裂 全屏或窗口模式 我正在使用默认的 SDL X11 驱动程序 谷歌搜索表明 X11 不提供垂直同步功能 这是 SDL 的一个已知问题 即使使用使
  • 如何在Python中抑制控制台输出?

    我正在使用 Pygame SDL 的操纵杆模块从游戏手柄获取输入 每次我打电话给它get hat 方法将其打印到控制台 这是有问题的 因为我使用控制台来帮助我调试 现在它被淹没了SDL JoystickGetHat value 0 每秒60
  • 如何从 Linux 与 SDL 2 对 Windows 进行交叉编译

    我尝试在 Arch Linux 64 位 上使用 SDL 2 和 mingw w64 g 编译器编译一个简单的 C 程序 为此 我从以下位置下载了 SDL2 devel 2 0 4 mingw tar gzhere https www li
  • 图形编程的 GLUT 已经死了吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 阅读 Ubuntu 论坛上有关以下内容的讨论后GLUT 与 FreeGLUT http ubuntuforums org showthread
  • 网络对讲终端 网络音频终端 网络广播终端SV-7011V使用说明

    高速路sip广播对讲求助 隧道sip对讲调度SIP 7011 网络广播终端SV 7011 壁挂式对讲终端网络监听终端SIP广播终端 sip语音对讲终端SIP 7011 SV 7011网络对讲终端网络对讲 网络厂播 监听 SV 7101网络解
  • 光端机技术综述:从理论到实践的全面探索

    在当今数据驱动的时代 光端机技术 已成为通信领域的核心组成部分 从理论的深度研究到实践的广泛应用 光端机技术不断推动着信息社会的发展 成为连接不同设备和网络的关键技术 技术特点 高速数据传输 光端机 利用光纤传输数据 具有极高的传输速率 相
  • SDL2 主游戏循环

    我的问题是在阅读lazyfoo net上的SDL2教程时出现的 代码是从这一页 http lazyfoo net tutorials SDL 07 texture loading and rendering index php int ma
  • 如何在没有DLL的情况下编译SDL程序并运行它

    是否可以将SDL库程序编译为exec并在没有 sdl dll 的情况下运行它 例如 假设我编写了 sdl 程序 它可以工作 但问题是要在 Windows 上运行该程序 我需要在同一文件夹或系统文件夹中包含 sdl dll 是否可以编译它 以
  • 为什么我的 unique_ptr 认为有一个空函数指针删除器? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 C 学习 SDL 我创建了一个window h标头和一个window cpp用于存储 Window 类的源文件 在window h它看起来像这样 Class Window public Windo
  • 具有多个窗口的 SDL 2.0 退出事件

    我正在使用 SDL 2 0 并决定尝试制作多个窗口 不幸的是 现在我无法退出程序而不返回 IDE 并强制关闭它 事件处理尽可能简单 我只轮询退出事件 并且在添加第二个窗口之前它工作得很好 使用多个窗口时是否会忽略退出事件 如果是这样 我怎样
  • 防止SDL程序消耗额外资源

    我正在设计应该在图像上展示开放简历的程序 我注意到基本 SDL 应用程序的概念非常糟糕 它由循环和延迟组成 while true while event is in buffer event process event event do s
  • SDL 2.0源码中有1.3吗?

    我正在研究 SDL 2 0 源代码 注意到其中有另一个声称是 1 3 版本的 SDL 文件夹 我对它很感兴趣 因为它有 android iphone 和其他一些的源代码 稳定版本 1 2 似乎有很大不同 我的问题是这样的 SDL 维基链接
  • 如何将 ffplay 作为无窗口进程运行?

    我正在运行 ffplay 作为后台进程 它向我的主 UI 进程提供图像数据 我已经设定 SDL VIDEODRIVER dummy 抑制 SDL 窗口中显示的 ffplay 视频 问题是 即使不显示视频输出窗口 ffplay 进程仍然显示为
  • libSDL、CMake 和 Mac OS X Lion

    我正在尝试在我的Mac上编译cmake项目 但它取决于SDL框架 我安装了这个框架 在 cmake 之后向我报告找不到 libSDL 我自己设置了以下导出变量 按照 cmake 的建议 export SDL INCLUDE DIR Libr
  • 渲染 TTF SDL2.0 opengl 3.1

    我正在使用 SDL2 0 并使用 半现代 opengl 3 1 我希望向我的应用程序添加文本叠加 并在应用程序中呈现 TTF 我将如何使用现代 OpenGL 来解决这个问题 编辑 根据 genpfault 的建议 我尝试使用 SDL TTF

随机推荐

  • HJ61 放苹果

    题目 HJ61 放苹果 题解 递归 f m n 表示将m个苹果放在n个盘子中所有的放法 当n gt m时 一定有盘子空着 等效于将m个苹果放到m个盘子中 即f m n f m m 当 n lt m时 没有空盘子 那么每个盘子至少有一个 那么
  • 共享单车数据如何可视化?这篇文章手把手教你

    大家好 本篇文章是我今年立的flag的第5篇打卡文章 如果还不清楚背景的童鞋可以回看我今年1月1日发的这篇文章2021年来了 是时候为新的一年再立几个新的flag了 今天选取的地图是前几天利用数字中国创新大赛提供的共享单车数据做的一个可视化
  • org.hibernate.NonUniqueObjectException:a different object with the same identifier 异常解决方法

    问题 org hibernate NonUniqueObjectException a different object with the same identifier value was already associated with
  • 数字图像处理:直方图匹配或规定化Histogram Matching (Specification)原理及感悟

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 注意 本文是 数字图像直方图匹配或规定化Histogram Matching Specification 处理 增加了部分问题的进一步解释后的
  • 世界树服务器bug位置,四叶草剧场世界树bug怎么获得 世界树bug神器获取位置图文详解...

    核心提示 四叶草剧场世界树bug怎么获得 在四叶草剧场的游戏中 世界树的爬塔挑战是最近玩家们正在参与的 不少玩家不知道BUG神器在哪一层怎么获得 接下来小编就为大家详细的介绍一下四叶草剧场世界树bug神器的获取位置图文详解吧 四叶草剧场世界
  • Linux使用jdk报错 /lib/ld-linux.so.2: bad ELF interpreter: No such file or direct

    有人说sudo yum install glibc i686可以解决问题 但是我认为不是这个问题 具体原因应该是在64位的机器中要兼容32位的jdk才会有这个问题 最根本的问题应该是jdk安装的版本错误 使用uname a查看linux架构
  • 分支限界---->15-谜问题

    15 谜问题 一 问题描述 在一个分成16格的方形棋盘上放有15块编了号的牌 对于这些牌给定的一种初始排列 要求通过一系列的合法移动将初始排列转换成目标排列 合法移动 每次将一个邻接于空格的牌移动到空格位置 注 并不是所有的初始状态都能变换
  • 单片机三种烧录方式ICP、IAP和ISP详解

    单片机三种烧录方式ICP IAP和ISP详解 目录 单片机三种烧录方式ICP IAP和ISP详解 1 ICP In Circuit Programing 2 ISP In System Programing 3 IAP In applica
  • 如何用idea开发vue

    文章目录 一 建脚手架 二 使用步骤 1 把项目拉入idea 提示 以下是本篇文章正文内容 下面案例可供参考 一 建脚手架 下载node和vue脚手架 C gt node v v10 14 1 C gt npm install g vue
  • Solidworks绘制齿轮过程备注

    1 使用solidworks自带的toolbox绘制齿轮 如果toolbox打开失败 按照以下方法修复一下 https blog csdn net sinat 38295192 article details 105612369 2 too
  • 【0325】分组密码

    分组密码 体制概述 分组密码体制 Block cipher 是在密钥k控制下一次变换一个明文数据块 又称分组 的密码体制 特点 速度快 易于标准化和便于软硬件实现等特点 设计原则和评估 针对安全性的两个基本原则 扩散和混淆 对抗统计分析 扩
  • Solidity学习代码示例 - 第一节

    掌握了Solidity的基本语法后 我们开始从一些简单的代码层面上来慢慢深入学习Solidity这门语言 在这篇文章中 我将会在代码层面带着大家去实现我们想要的逻辑 带着大家一起感受Solidity这门语言 我们所有的代码编译部署都是在智能
  • elementUI实现上传视频时获取视频时长以及设置视频格式、大小限制

    在 before upload 属性绑定的事件中可以获取上传视频的信息对象 通过给这个信息对象内的属性添加判断条件就可以实现对视频的格式及大小进行限制 对于视频时长 也包含在信息对象中 根据下面代码所示方法提取即可 想了解如何给上传图片添加
  • 刷脸支付只需一个确认的眼神就可以付款

    让我们来设想一下这样的场景 你早上匆匆忙忙赶着出门买东西却忘记带手机 没关系 带脸就OK 腾出两只手拎更多的战利品 在结账时候刚好客户打来电话 挂掉又不礼貌 没关系 刷脸支付只需要一个确认的眼神 还有很多方面 刷脸支付将像当年的支付宝一样
  • spring mongodb geo 位置搜索服务 示例

    1 项目关联jar文件 2 配置mongodb xml文件
  • 不知道麦克风阵列是何方神圣?这篇文章告诉你!

    转自 http www ikanchai com 2016 0522 80416 shtml 城宇智能硬件 发布 砍柴网推荐 转载需注明 上个世纪七八十年代 麦克风阵列技术已经开始应用到语音技术的研究中 2000年左右 业界开始慢慢深入 进
  • Java面试复习提纲

    Java面试复习提纲 作者 egg 邮箱 xtfggef gmail com 微博 http weibo com xtfggef 博客 http blog csdn net zhangerqing 本章主要介绍一下面对即将来临的Java面试
  • apache24服务启动

    声明 本文 禁止转载 本文所有观点和概念都系个人总结 难免存在疏漏之处 为不至于诱导初学者误入歧途 望各位以自己实践为准 特此声明 如有错误请告知 服务 链接 https pan baidu com s 1VS xSo3eC7TxihciN
  • 仅四步教你快速接入Seata分布式事务

    简介 Seata 是一款开源的分布式事务解决方案 致力于提供高性能和简单易用的分布式事务服务 Seata 将为用户提供了 AT TCC SAGA 和 XA 事务模式 为用户打造一站式的分布式解决方案 本篇文章将以视频与文字介绍的形式 指引你
  • Qt+SDL播放YUV视频文件

    播放一个yuv420p格式的文件 yuv的格式与rgb格式的存储方式不同 yuv数据是 yyyyyyyy uu vv 的存储 rgb是rgba rgba rgba 存储 同样一帧图像 yuv420会比rgb数据更小 读取时就要注意数据存储格