SDL教程(二)——Qt+SDL播放器

前言

​ 这篇文章主要是使用SDL来打开视频,显示视频。后续会再继续使用SDL来结合FFmpeg。来能够直接使用网上的demo进行学习。

正文

一、环境

Qt 5.15.2 MSVC2019 64bit

Win11

二、Qt搭建SDL

Qt搭建,我觉得相比用VS2019来说,更为方便,至少你后面再新建一个项目的时候,很多代码直接拷过去就可以了,不用每次都去点属性页。确实,也可以在VS2019上搭建一个通用属性页,到哪里,就拷贝到哪,这倒也是一种方法。

1、肯定就是还是那些库,关于下载的可以去参考第一篇文章:SDL教程(一)——开发环境

2、Qt pro文件中引入:

INCLUDEPATH += $$PWD/../../SDL_Lib/include
LIBS += -L$$PWD/../../SDL_Lib/lib/x64 -lSDL2
LIBS += -L$$PWD/../../SDL_Lib/lib/x64 -lSDL2main

3、我待会直接打包上传到CSDN上,有需要的可以去下载,但一般来说,应该把这篇文章看完就好了,下载,只是说让你免去一些拷贝的步骤以及自己找一些文件罢了。
SDL显示yuv视频以及库文件都在里面
文件都在这里面

三、显示yuv文件

1、可以直接在MainWindow搞个函数来显示。

int MainWindow::ShowVideo()
{
    // yuv file
    FILE *fyuv;

    int srcW = 320;
    int srcH = 180;

    fopen_s(&fyuv, "frame_320x180_out.yuv", "rb");  // yuv420p
    char* buf = new char[srcW*srcH * 3 / 2];

    // SDL
    SDL_Window *window;
    SDL_Renderer *renderer;
    SDL_Texture *texture;
    SDL_Rect rect;
    SDL_Event event;

    int screen_w = srcW;
    int screen_h = srcH;

    window = SDL_CreateWindow("SDL2.0 Video Sample", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
                              screen_w, screen_h, SDL_WINDOW_RESIZABLE);
    if(!window) {
        SDL_LogError(1, "SDL: SDL_CreateWindow failed.");
        return 0;
    }

    renderer = SDL_CreateRenderer(window, -1, 0);
    if(!renderer) {
        SDL_LogError(1, "SDL: SDL_CreateRenderer failed.");
        return 0;
    }

    texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV,  //指定纹理为yuv420p
                                SDL_TextureAccess::SDL_TEXTUREACCESS_STREAMING, screen_w, screen_h);
    if(!texture) {
        SDL_LogError(1, "SDL: SDL_CreateTexture failed.");
        return 0;
    }

    rect = SDL_Rect{0,0,screen_w, screen_h};   // 尺寸需要与texture相同

    while(1)
    {
        if(fread(buf, srcW*srcH * 3 / 2, 1, fyuv) <= 0)
            break;

        SDL_UpdateTexture(texture, &rect, buf, srcW);  // YUV数据是连续的,1字节对齐

        SDL_RenderClear(renderer);
        SDL_RenderCopy(renderer, texture, NULL, &rect);
        SDL_RenderPresent(renderer);

        SDL_Delay(40);
    }

    free(buf);
    SDL_Quit();
}

2、效果

在这里插入图片描述

3、也可以直接将代码弄到main.cpp里面

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
#include <iostream>

#define SDL_MAIN_HANDLED
#include "SDL.h"

int main()
{
    // yuv file
    FILE *fyuv;

    int srcW = 320;
    int srcH = 180;

    fopen_s(&fyuv, "frame_320x180_out.yuv", "rb");  // yuv420p
    char* buf = new char[srcW*srcH * 3 / 2];

    // SDL
    SDL_Window *window;
    SDL_Renderer *renderer;
    SDL_Texture *texture;
    SDL_Rect rect;
    SDL_Event event;

    int screen_w = srcW;
    int screen_h = srcH;

    window = SDL_CreateWindow("SDL2.0 Video Sample", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
                              screen_w, screen_h, SDL_WINDOW_RESIZABLE);
    if(!window) {
        SDL_LogError(1, "SDL: SDL_CreateWindow failed.");
        return 0;
    }

    renderer = SDL_CreateRenderer(window, -1, 0);
    if(!renderer) {
        SDL_LogError(1, "SDL: SDL_CreateRenderer failed.");
        return 0;
    }

    texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV,  //指定纹理为yuv420p
                                SDL_TextureAccess::SDL_TEXTUREACCESS_STREAMING, screen_w, screen_h);
    if(!texture) {
        SDL_LogError(1, "SDL: SDL_CreateTexture failed.");
        return 0;
    }

    rect = SDL_Rect{0,0,screen_w, screen_h};   // 尺寸需要与texture相同

    while(1)
    {
        if(fread(buf, srcW*srcH * 3 / 2, 1, fyuv) <= 0)
            break;

        SDL_UpdateTexture(texture, &rect, buf, srcW);  // YUV数据是连续的,1字节对齐

        SDL_RenderClear(renderer);
        SDL_RenderCopy(renderer, texture, NULL, &rect);
        SDL_RenderPresent(renderer);

        SDL_Delay(40);
    }

    free(buf);
    SDL_Quit();
}

如果弄到main.cpp里面,第一句代码#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
不加这句就会报这个错:
在这里插入图片描述

四、遇到的问题

1、error: LNK2005: _main 已经在 main.obj 中定义

在main.cpp的第一行加上这句代码:

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

参考

1、ffmpeg 使用SDL2播放音频、视频 (1) 视频播放

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

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

相关文章

密文域可逆信息隐藏安全性研究-从图像到视频

前言 随着云存储、云计算等新兴技术的兴起&#xff0c;海量的隐私信息被广泛地上传、存储到服务器上。为保证用户的隐私性&#xff0c;必须对用户的数据进行加密&#xff0c;然后再将其上传到服务器上。因此&#xff0c;密文域的可逆信息隐藏(reversible data hiding in encry…

Vue3 -Computed计算属性

前言&#xff1a; Computed属性属于Vue3中的响应式核心(与之共同说明的还有ref&#xff0c;reactive&#xff0c;watch...) 接受一个 getter 函数&#xff0c;返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set…

内网-1(win工作组与域环境)

一、概述 1、工作组&#xff1a;将不同的计算机按功能(或部门)分别列入不同的工作组 (1)、查看&#xff08;windows&#xff09; 查看当前系统中所有用户组&#xff1a;打开命令行--》net localgroup查看组中用户&#xff1a;打开命令行 --》net localgroup 后接组名查看用户…

【C语言进阶】文件操作:文件的打开与文件的读写以及文本文件和二进制文件

目录 1、为什么使用文件 2、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3、文件的打开和关闭 3.1文件指针 3.2文件的打开与关闭 4、文件的顺序读写 4.1 几个函数的区别 5、文件随机读写 5.1 fseek 5.2 ftell 5.3 rewind 6、文本文件和二进制文件…

APM32F003评测,基本参数,点LED

简介 该是一个基于APM32F003 32位Cortex-M0 工业级 单片机开发板。主频高达48MHz&#xff0c;AHB 总线、APB 总线&#xff0c;无需外部晶振即可运行&#xff0c;价格实惠。为专业人士、工业ODM、AIoT爱好者、DIY爱好者和创作者提供了一个可靠、低成本和高性能的平台。 这款开发…

LangChain学习圣经:从0到1精通LLM大模型应用开发的基础框架

尼恩&#xff1a;LLM大模型学习圣经PDF的起源 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;经常性的指导小伙伴们改造简历。 经过尼恩的改造之后&#xff0c;很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#x…

MFC3d立体按钮制作

1、本程序基于前期我的博客文章MFC用CButtonST类实现图片透明按钮(免费源码下载) 2、添加CeXDib.cpp CeXDib.h ShadeButtonST.cpp ShadeButtonST.h到项目文件夹下&#xff0c;和FileView中如图。 3、在ButtonShadeDlg.h中添加代码 #include "ShadeButtonST.h" #in…

回文串算法题

回文串是一个正着读和反着读顺序一样的字符串。"aba" 是回文串&#xff0c;"abba" 是回文串&#xff0c;"abc" 不是回文串。 回文串的题目&#xff0c;都要使用一个基本的逻辑&#xff0c;就是判断当前这个字符串是不是回文串。以 c 为例&#…

无限光年人工智能技术创新PMO负责人端煜受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 无限光年&#xff08;上海&#xff09;技术有限公司人工智能技术创新PMO负责人、原字节跳动朝夕光年PMO总监端煜先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“中国传统哲学在LLM企业项目管理应用中的思考与实践”。…

移植2D物理引擎到LVGL

背景 在LVGL交流群&#xff0c;有网友提出想要移植物理引擎到LVGL&#xff0c;遂有了本文。阅读本文需要对IDF和LVGL有所了解 过程 2D物理引擎有很多&#xff0c;经过一番调研选择了Chipmunk2D 下载源码 此处省略一万字&#xff0c;Github访问可能会有些慢 添加文件 将…

达梦8 内存泄漏泄漏原因分析之一

在实际使用过程中经常发现DMSERVER进程在OS中的内存占用使用远远超过实际情况。原因有很多&#xff0c;下面列出其中一种&#xff1a; 测试库版本 SQL> select id_code;LINEID ID_CODE ---------- ----------------------------------- 1 --03134283938-2022…

DPDK基础组件一(mbuf、ring、pktmbuf_pool)

一、rte_mbuf 此部分转自:https://zhuanlan.zhihu.com/p/616314276 1.mbuf结构 mbuf是报文中的描素的结构体,是整个转发过程中最核心的数据结构之一。主要针对于mbuf的常用API与基本原理做一个简单的介绍。 mbuf:报文内存存储结构,存储在mempool中mempool:使用环形缓冲…

如何选择D类音频放大器(数字功率放大器)

1 简介 多年来&#xff0c;音频内容一直在不断发展。从当地唱片店购买 12 英寸 LP 黑胶唱片的时代已经成为过去&#xff0c;现在我们通过流式传输几乎可即时播放云端的任何内容。虽然一些音频爱好者会为了获得新奇体验而重拾黑胶唱片&#xff0c;但今天绝大多数的音频都是以数…

基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细

基于Nginx和Consul构建自动发现的Docker服务架构 文章目录 基于Nginx和Consul构建自动发现的Docker服务架构资源列表基础环境一、安装Docker1.1、Consul节点安装1.2、registrator节点安装 二、案例前知识点2.1、什么是Consul 三、基于Nginx和Consul构建自动发现的Docker服务架构…

[NOIP2015 提高组] 子串

题目背景 NOIP2015 Day2T2 题目描述 有两个仅包含小写英文字母的字符串 A A A 和 B B B。 现在要从字符串 A A A 中取出 k k k 个互不重叠的非空子串&#xff0c;然后把这 k k k 个子串按照其在字符串 A A A 中出现的顺序依次连接起来得到一个新的字符串。请问有多少…

从集合论到位运算

前言 本文将扫清位运算的迷雾&#xff0c;在集合论与位运算之间建立一座桥梁。 在高中&#xff0c;我们学了集合论&#xff08;set theory&#xff09;的相关知识。例如&#xff0c;包含若干整数的集合 S{0,2,3}。在编程中&#xff0c;通常用哈希表&#xff08;hash table&…

计算机网络学习2

文章目录 信道复用技术 第三章数据链路层概述数据链路层的三个重要问题封装成帧和透明传输差错检测可靠传输的相关基本概念可靠传输的实现机制停止等待协议回退N帧协议选择重传协议 点对点协议PPP共享式以太网网络适配器和MAC地址CSMA_CD协议的基本原理共享式以太网的争用期共享…

【计算机毕业设计】331基于微信小程序的家庭财务管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

开源VS闭源:大模型发展路径之争,你站哪一派?

文章目录 引言一、数据隐私1.1开源大模型的数据隐私1.2 闭源大模型的数据隐私1.3 综合考量 二、商业应用2.1 开源大模型的商业应用2.2 闭源大模型的商业应用2.3 商业应用的综合考量 三、社区参与3.1 开源大模型的社区参与3.2 闭源大模型的社区参与3.3 综合考量 结论 引言 在人…

数据库与数据库管理系统 MySQL的安装 SQL语言学习:DDL、DML

day51 数据库 数据库&#xff08;database&#xff09;就是一个存储数据的仓库。为了方便数据的存储和管理&#xff0c;它将数据按照特定的规律存储在磁盘上。 通过数据库管理系统&#xff0c;可以有效地组织和管理存储在数据库中的数据&#xff0c;如数据库管理系统MySQL 数据…