网站有风险提示怎么办,phpcms和wordpress,百度官方电话人工服务电话,phpcms门户网站前言
SDL中内置加载BMP的API#xff0c;使用起来会更加简单#xff0c;便于初学者学习使用SDL
如果需要加载JPG、PNG等其他格式的图片#xff0c;可以使用第三方库#xff1a;SDL_image 测试环境#xff1a;
ffmpeg的4.3.2自行编译版本windows环境qt5.12sdl2.0.22…前言
SDL中内置加载BMP的API使用起来会更加简单便于初学者学习使用SDL
如果需要加载JPG、PNG等其他格式的图片可以使用第三方库SDL_image 测试环境
ffmpeg的4.3.2自行编译版本windows环境qt5.12sdl2.0.22mingw编译器
显示yuv图片需要知道yuv图片的尺寸和采样格式
ffplay -video_size 564x513 -pixel_format yuv420p out.yuv完整代码
SdlShowYuvThread.h
#ifndef SDLSHOWYUVTHREAD_H
#define SDLSHOWYUVTHREAD_H#include QObject
#include QThreadclass SdlShowYuvThread : public QThread
{Q_OBJECT
public:explicit SdlShowYuvThread(QObject *parent nullptr);~SdlShowYuvThread();signals:// QThread interface
protected:virtual void run() override;
};#endif // SDLSHOWYUVTHREAD_HSdlShowYuvThread.cpp
#include sdlshowyuvthread.h#include SDL2/SDL.h
#include QDebug
#include QFile#define END(judge, func) \if (judge) { \qDebug() #func error SDL_GetError(); \goto end; \}#define FILENAME E:/media/picture-test-yuv420p.yuv
#define PIXEL_FORMAT SDL_PIXELFORMAT_IYUV
#define IMG_W 1928
#define IMG_H 1048SdlShowYuvThread::SdlShowYuvThread(QObject *parent) : QThread(parent)
{// 当监听到线程结束时finished就调用deleteLater回收内存connect(this,SdlShowYuvThread::finished,this,[](){this-deleteLater();qDebug()SdlShowYuvThread线程结束;});
}SdlShowYuvThread::~SdlShowYuvThread()
{// 断开所有的连接disconnect();// 内存回收之前正常结束线程requestInterruption();// 安全退出quit();wait();qDebug() this 析构内存被回收;
}void SdlShowYuvThread::run()
{// 窗口SDL_Window *window nullptr;// 渲染上下文SDL_Renderer *renderer nullptr;// 纹理直接跟特定驱动程序相关的像素数据SDL_Texture *texture nullptr;// 文件QFile file(FILENAME);// 初始化子系统END(SDL_Init(SDL_INIT_VIDEO), SDL_Init);// 创建窗口window SDL_CreateWindow(// 标题SDL显示YUV图片,// xSDL_WINDOWPOS_UNDEFINED,// ySDL_WINDOWPOS_UNDEFINED,// wIMG_W,// hIMG_H,SDL_WINDOW_SHOWN);END(!window, SDL_CreateWindow);// 创建渲染上下文renderer SDL_CreateRenderer(window, -1,SDL_RENDERER_ACCELERATED |SDL_RENDERER_PRESENTVSYNC);if (!renderer) {renderer SDL_CreateRenderer(window, -1, 0);END(!renderer, SDL_CreateRenderer);}// 创建纹理texture SDL_CreateTexture(renderer,PIXEL_FORMAT,SDL_TEXTUREACCESS_STREAMING,IMG_W, IMG_H);END(!texture, SDL_CreateTexture);// 打开文件if (!file.open(QFile::ReadOnly)) {qDebug() file open error FILENAME;goto end;}// 将YUV的像素数据填充到textureEND(SDL_UpdateTexture(texture, nullptr, file.readAll().data(), IMG_W),SDL_UpdateTexture);// 设置绘制颜色画笔颜色END(SDL_SetRenderDrawColor(renderer,0, 0, 0, SDL_ALPHA_OPAQUE),SDL_SetRenderDrawColor);// 用绘制颜色画笔颜色清除渲染目标END(SDL_RenderClear(renderer),SDL_RenderClear);// 拷贝纹理数据到渲染目标默认是windowEND(SDL_RenderCopy(renderer, texture, nullptr, nullptr),SDL_RenderCopy);// 更新所有的渲染操作到屏幕上SDL_RenderPresent(renderer);// 等待退出事件while (!isInterruptionRequested()) {SDL_Event event;SDL_WaitEvent(event);switch (event.type) {case SDL_QUIT:goto end;}}end:file.close();SDL_DestroyTexture(texture);SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);SDL_Quit();
}线程调用
void MainWindow::on_pushButton_sdl_show_yuv_clicked()
{m_pSdlShowYuvThreadnew SdlShowYuvThread(this);m_pSdlShowYuvThread-start();
}注意.h文件中提前声明了以下全局变量 SdlShowYuvThread *m_pSdlShowYuvThreadnullptr;注意本文为个人记录新手照搬可能会出现各种问题请谨慎使用 码字不易如果这篇博客对你有帮助麻烦点赞收藏非常感谢有不对的地方