IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 基于最新的ffmpeg5.0库+QT yuv转rgb图片查看器 -> 正文阅读

[开发工具]基于最新的ffmpeg5.0库+QT yuv转rgb图片查看器

一、官网下载ffmpeg库

1.点击Windows图标下面的第一个库连接
官网地址:https://ffmpeg.org/download.html
库地址:https://www.gyan.dev/ffmpeg/builds/
请添加图片描述
2.选择发行版本库,这里我选择的是共享库5.0
请添加图片描述
3.解压后如下图所示,bin文件夹带有官方发行版本运行库xx.dll,lib文件夹带有我们所使用的开发库

请添加图片描述
请添加图片描述
请添加图片描述

二、建立QT工程

1.你可以和我一样,亦可以自行选择工程
请添加图片描述
2.pro工程套件配置,编译器选择64位的编译器,当然你也可以选择32位的编译器MinGw
请添加图片描述
3.pro文件链接ffmpeg库,注意,库有64位的,也有32位的,对应自己QT的MinGw的位数
在这里插入图片描述
4.包含头文件,由于ffmpeg库是由c语言编写,所以头文件声明为 extern "c”
在这里插入图片描述

三、编程

1.头文件

class MyTest : public QMainWindow
{
    Q_OBJECT

public:
    MyTest(QWidget *parent = nullptr);
    ~MyTest();

    void readDir(QString _dirname);
    void readFile(QString file_path);
    void readUiArg();
    void setUiArg();
    void yuvToRgb(void* str,AVPixelFormat yuv_fmt,uint32_t str_w, uint32_t str_h);
    void showImag(QString file_path);
protected:
    void paintEvent(QPaintEvent *event);

private slots:
    void slotGetOneFrame(QImage img);
    void slotBtnClicked();

    void on_listWidget_file_itemDoubleClicked(QListWidgetItem *item);


    void on_comboBox_wh_currentIndexChanged(const QString &arg1);

signals:
     void sig_GetOneFrame(QImage img);

private:
    Ui::MyTest *ui;
    QVector <QString>filename;
    QString dirname;//绝对路径
    QImage rgbImage,displayImage;

    QByteArray str_date;

    uint32_t file_size;
    uint32_t yuv_w,yuv_h,yuv_size;
    uint32_t rgb_w,rgb_h,rgb_size;
    AVPixelFormat cur_yuv_fmt;

    uint8_t *yuvBuffer;
    AVFrame *pFrame ;
    AVFrame *pFrameRGB;

    uint8_t * rgbBuffer;
    SwsContext *img_convert_ctx;

    QString cur_img_path;
    int n_count;
    int index;
};

2.重要方法函数 yuv转rgb

void MyTest::yuvToRgb(void *str,AVPixelFormat yuv_fmt, uint32_t str_w, uint32_t str_h)
{
    rgb_w = str_w;
    rgb_h = str_h;

    yuv_size = str_w * str_h * 3 /2;
    yuvBuffer = (uint8_t *)malloc(yuv_size);

    pFrame = av_frame_alloc();
    pFrameRGB = av_frame_alloc();
    rgb_size =av_image_get_buffer_size(AV_PIX_FMT_RGB32, rgb_w, rgb_h, 1);
    rgbBuffer = (uint8_t *) av_malloc(rgb_size * sizeof(uint8_t));

    av_image_fill_arrays(pFrameRGB->data, pFrameRGB->linesize, rgbBuffer, AV_PIX_FMT_RGB32, rgb_w, rgb_h,1);

    img_convert_ctx = sws_getContext(str_w, str_h, yuv_fmt, rgb_w, rgb_h, AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL);

    av_image_fill_arrays(pFrame->data,pFrame->linesize,(uint8_t *)str, yuv_fmt, str_w,str_h,1);
    sws_scale(img_convert_ctx,(uint8_t const * const *) pFrame->data,\
            pFrame->linesize, 0, str_h, pFrameRGB->data, pFrameRGB->linesize);
    for(int i=0;i<10000;i++)
        for(int i=0;i<1000;i++);
    QImage tmpImg((uchar *)rgbBuffer,rgb_w,rgb_h,QImage::Format_RGB32);
    rgbImage = tmpImg.copy();
}

3.事件重绘方法函数

void MyTest::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    if (rgbImage.size().width() <= 0) return;
    //将图像按比例缩放成和窗口一样大小
    QImage img = rgbImage.scaled(ui->widget_video->size(),Qt::KeepAspectRatio);

    int x = ui->widget_video->width() - img.width();
    int y = ui->widget_video->height() - img.height();

    x /= 2;
    y /= 2;


    painter.drawImage(QPoint(x,y),img); //画出图像
}

4.递归加载文件

void MyTest::readDir(QString _dirname)
{
    QDir mydir(_dirname);
    QStringList filelist=mydir.entryList();
    for(int i=0;i<filelist.size();i++)
    {
           QString path=QString("%1/%2").arg(_dirname).arg(filelist.at(i));
           if(filelist.at(i)=="."||filelist.at(i)=="..")
                continue;
           QFileInfo myinfo(path);
           if(myinfo.isDir())
           {
               readDir(path);//递归
           }
           if(myinfo.isFile())
           {
               if(filelist.at(i).contains(".yuv"))
               {
                    ui->listWidget_file->addItem(filelist.at(i));
                    filename.push_back(path);
               }
           }
    }
}

四、UI界面设计

1.ui界面
在这里插入图片描述

五、运行效果

1.选择图片格式及分辨率,我这里是YUV420 2592x1944,这些yuv图片是我用V4L2编程代码从硬件里面保存下来的。
2.双击yuv19.yuv在这里插入图片描述

3.双击yuv20.yuv
在这里插入图片描述

六、结束语

1.由于自己从事硬件相关工作,需要查看yuv420格式的图片,从百度拿的app看yuv比较麻烦,所以自己就写了一个,百度的ffmpeg方法都是比较老的且有许多版本造成的问题,我这里是用最新的库编写的。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:50:46  更:2022-02-26 11:52:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:28:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码