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 288


MainWindow::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);
    }

}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java高级工程师1380道面试题(附答案)分享

Java 面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。现如今&#xff0c;Java 面试的本质就是八股文&#xff0c;把八股文面试题背好&#xff0c;面试才有可能表现好。…

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

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

VS2022 无法使用GitHub账户登录/无法使用copilot 解决方案

无法登录github 账户 错误提示如下&#xff1a; We encountered an issue while adding your GitHub account. Exception Type: GitHubSignInException. Inner Exception: StreamJsonRpc.RemoteInvocationException. Error Message: The input is not a valid Base-64 str…

前端样式练手:阴阳图+时钟的组合

开篇 今天的小作品是突然脑子灵光一闪写出来的&#xff0c;代码不多&#xff0c;就不过多赘述了。 代码实现 <template><div class"clock-container"><!-- 八卦图 --><!-- <div class"bagua"><divv-for"(trigram, ind…

对话 Project Astra 研究主管:打造通用 AI 助理,主动视频交互和全双工对话是未来重点

Project Astra 愿景之一&#xff1a;「系统不仅能在你说话时做出回应&#xff0c;还能在持续的过程中帮助你。」 近期&#xff0c;Google DeepMind 的 YouTube 频道采访了 Google DeepMind 研究主管格雷格韦恩 (Greg Wayne)。 格雷格韦恩的研究工作为 DeepMind 的诸多突破性成…

Maven 项目文档

如何创建 Maven 项目文档。 比如我们在 C:/MVN 目录下&#xff0c;创建了 consumerBanking 项目&#xff0c;Maven 使用下面的命令来快速创建 java 项目&#xff1a; mvn archetype:generate -DgroupIdcom.companyname.bank -DartifactIdconsumerBanking -DarchetypeArtifact…

目标检测——基于yolov8和pyqt的螺栓松动检测系统

目录 1.项目克隆和环境配置1.1 我这里使用的是v8.0.6版本1.2 项目代码结构介绍 2.数据集介绍2.1 数据集采集2.2采集结果介绍 3.模型训练4.pyqt界面设计4.1 界面内容介绍4.2 界面实现 5.操作中的逻辑实现5.1 图片检测5.2 文件夹检测5.3 视频检测和摄像头检测 6. 效果展示 1.项目…

HTTP 协议、AJAX - 异步网络请求及跨域、同源策略

文章目录 一、HTTP 协议简述1. 协议的基本理解2. HTTP 协议的数据格式 二、Express 服务器1. Express 服务器的安装和启动2. Express 服务器的基本使用 三、AJAX 异步网络请求1. ES5 的 XMLHttpRequest 对象实现 AJAX 异步网络请求2. 利用 jQuery 库实现 AJAX 异步网络请求3. E…

使用 OpenCV 绘制线条和矩形

OpenCV 是一个功能强大的计算机视觉库&#xff0c;它不仅提供了丰富的图像处理功能&#xff0c;还支持图像的绘制。绘制简单的几何图形&#xff08;如线条和矩形&#xff09;是 OpenCV 中常见的操作。在本篇文章中&#xff0c;我们将介绍如何使用 OpenCV 在图像上绘制线条和矩形…

【每日学点鸿蒙知识】上架流程、h5返回收拾拦截、两个枚举类型之间转换、hvigorw命令、绘制本地图片

1、HarmonyOS 上架流程&#xff1f; 上架流程&#xff0c;请参考文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-publish-app-V5 上架的一些条件&#xff0c;也请 这边悉知&#xff0c;参考链接&#xff1a;https://developer.huawe…

使用腾讯云CVM搭建 K8s + Docker + Harbor :部署SpringBoot应用与配置指南

在现代云原生应用的开发和部署过程中&#xff0c;容器化技术已经成为主流&#xff0c;而 Kubernetes&#xff08;K8s&#xff09;则是容器编排的绝对领导者。为了高效地管理和分发容器镜像&#xff0c;拥有一个可靠的私有镜像仓库是每个开发者和运维工程师不可或缺的工具。Dock…

第5章 组合计数与离散概率

2024年12月25日 5.1 基本原理 5.1.1 加法原理 5.1.2 乘法原理 5.2 排列与组合 5.2.1 排列 5.2.2 组合 5.3 排列组合生成算法 5.3.1 排列生成算法 5.3.2 组合生成算法 5.4 广义的排列和组合 5.5 二项式系数和组合恒等式 5.5.1 二项式定理 5.5.2 组合恒等式 5.6 鸽笼…

oscp备战系列-Kioptrix2014

文章目录 一、信息收集二、漏洞探测三、漏洞利用四、后渗透 一、信息收集 主机探测 nmap 192.168.30.0/24 -sP端口及版本探测 nmap 192.168.30.199 -sV可以看到开放了80&#xff0c;8080端口&#xff0c;采用apache 2.2.21 mod_ssl2.2.21 openssl0.9.8q WebDAV2 php5.3.8 O…

sqli-labs关卡记录13

同样还是post型&#xff0c;按照常规的方法&#xff0c;抓包&#xff0c;找到注入点&#xff1a; updatexml(1,concat(0x7e,substr((select group_concat(username,password)from users),31,30),0x7e),1)-- 这里找到注入点&#xff0c;闭合方式为)类型&#xff0c;然后就是判断…

操作系统(23)外存的存储空间的管理

一、外存的基本概念与特点 定义&#xff1a;外存&#xff0c;也称为辅助存储器&#xff0c;是计算机系统中用于长期存储数据的设备&#xff0c;如硬盘、光盘、U盘等。与内存相比&#xff0c;外存的存储容量大、成本低&#xff0c;但访问速度相对较慢。特点&#xff1a;外存能够…

matrix-breakout-2-morpheus

将这一关的镜像导入虚拟机&#xff0c;出现以下页面表示导入成功 以root身份打开kali终端&#xff0c;输入以下命令&#xff0c;查看靶机ip arp-scan -l 根据得到的靶机ip&#xff0c;浏览器访问进入环境 我们从当前页面没有得到有用的信息&#xff0c;尝试扫描后台 发现有一个…

最新的强大的文生视频模型Pyramid Flow 论文阅读及复现

《PYRAMIDAL FLOW MATCHING FOR EFFICIENT VIDEO GENERATIVE MODELING》 论文地址&#xff1a;2410.05954https://arxiv.org/pdf/2410.05954 项目地址&#xff1a; jy0205/Pyramid-Flow&#xff1a; 用于高效视频生成建模的金字塔流匹配代码https://github.com/jy0205/Pyram…

RSICV国产芯片之CHV208

1. 芯片选型分析的对比维度 分析或者对标应用的芯片替代思路 1.1 内核/主频/存储空间支持 内核能力/指令集支持&#xff08;考虑工具链兼容性&#xff09;&#xff1b; 主频&#xff1a;对比计算能力是否满足基本要求 存储&#xff1a;内存--数据搬移空间决定数据运算的…

7. petalinux 根文件系统配置(package group)

根文件系统配置&#xff08;Petalinux package group&#xff09; 当使能某个软件包组的时候&#xff0c;依赖的包也会相应被使能&#xff0c;解决依赖问题&#xff0c;在配置页面的help选项可以查看需要安装的包 每个软件包组的功能: packagegroup-petalinux-audio包含与音…

基于Spring Boot的个人健康管理系统

一、系统背景与意义 随着现代生活节奏的加快和人们健康意识的日益增强&#xff0c;个人健康管理成为了人们关注的焦点。然而&#xff0c;传统的健康管理方式往往依赖于纸质记录、定期体检等手段&#xff0c;不仅效率低下&#xff0c;而且难以实现对健康数据的持续跟踪和深入分…