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视频文件 的相关文章

  • 半监督目标检测(二)

    目录 Humble Teacher 1 要点 2 Overview 1 监督分支 2 非监督分支 3 图像增广 4 预测阶段 3 Soft Labels and Unsupervised Loss 1 RPN阶段 2 ROI 阶段 4 Ex

随机推荐

  • 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数据更小 读取时就要注意数据存储格