在 Qt 中显示解码视频帧的最有效方法是什么?

2023-12-29

将图像显示到 Qt 小部件的最快方法是什么?我已经使用 libavformat 和 libavcodec 解码了视频,因此我已经有了原始 RGB 或 YCbCr 4:2:0 帧。我目前正在使用 QGraphicsView 和包含 QGraphicsPixmapItem 的 QGraphicsScene 对象。我目前正在通过使用内存缓冲区中的 QImage 构造函数将帧数据获取到 QPixmap 中,并使用 QPixmap::fromImage() 将其转换为 QPixmap。

我喜欢这样的结果,而且看起来比较快,但我不禁认为一定有更有效的方法。我还听说 QImage 到 QPixmap 的转换很昂贵。我已经实现了一个在小部件上使用 SDL 覆盖的解决方案,但我想只使用 Qt,因为我能够使用 QGraphicsView 轻松捕获点击和与视频显示的其他用户交互。

我正在使用 libswscale 进行任何所需的视频缩放或色彩空间转换,因此我想知道是否有人有更有效的方法来在执行所有处理后显示图像数据。

Thanks.


感谢您的回答,但我最终重新审视了这个问题,并提出了一个相当简单的解决方案,可以提供良好的性能。它涉及源自QGLWidget并覆盖paintEvent()功能。在 - 的里面paintEvent()函数,你可以调用QPainter::drawImage(...)如果可用的话,它将使用硬件为您执行缩放到指定的矩形。所以它看起来像这样:

class QGLCanvas : public QGLWidget
{
public:
    QGLCanvas(QWidget* parent = NULL);
    void setImage(const QImage& image);
protected:
    void paintEvent(QPaintEvent*);
private:
    QImage img;
};

QGLCanvas::QGLCanvas(QWidget* parent)
    : QGLWidget(parent)
{
}

void QGLCanvas::setImage(const QImage& image)
{
    img = image;
}

void QGLCanvas::paintEvent(QPaintEvent*)
{
    QPainter p(this);

    //Set the painter to use a smooth scaling algorithm.
    p.setRenderHint(QPainter::SmoothPixmapTransform, 1);

    p.drawImage(this->rect(), img);
}

这样,我仍然需要将 YUV 420P 转换为 RGB32,但 ffmpeg 在 libswscale 中可以非常快速地实现该转换。主要收获来自两点:

  • 无需软件缩放。缩放在视频卡上完成(如果可用)
  • 转换自QImage to QPixmap,这发生在QPainter::drawImage()功能以原始图像分辨率执行,而不是按放大的全屏分辨率执行。

我用以前的方法将处理器固定在显示器上(解码是在另一个线程中完成的)。现在,我的显示线程仅使用大约 8-9% 的核心来进行全屏 1920x1200 30fps 播放。我确信如果我可以将 YUV 数据直接发送到视频卡,它可能会变得更好,但目前这已经足够好了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Qt 中显示解码视频帧的最有效方法是什么? 的相关文章

  • 我应该把 try/catch 和“using”语句放在哪里? [复制]

    这个问题在这里已经有答案了 可能的重复 try catch using 正确的语法 https stackoverflow com questions 4590490 try catch using right syntax 我想try c
  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 将 Swagger 与命名空间版本的 WebApi 结合使用

    我已经找到了如何使用基于名称空间的 WebAPI 版本这个班 https aspnet codeplex com SourceControl changeset view dd207952fa86 Samples WebApi Namesp
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g

随机推荐

  • PrimeFaces 的惰性数据模型加载方法未调用

    我碰巧不明白为什么我的加载方法没有在我的 primefaces 表的惰性数据模型中调用 我的 xhtml 页面是这样的
  • Heroku:当我执行“heroku run console”时,我需要付费吗?

    我分别运行了三个命令 bash console and node 当我做heroku ps我明白了 heroku ps Process State Command run 1 complete for 11m console run 2 c
  • Pl/SQL 嵌套过程异常处理

    这是关于通过多个级别的 PL SQL 过程进行错误处理的最佳实践问题 我查看了其他一些问题来帮助我解决问题 特别是this one https stackoverflow com questions 7360565 pl sql excep
  • 运行spring boot原生应用程序,无法加载资源文件

    我正在尝试将 Spring Boot 应用程序编译为本机应用程序并使用 docker 运行它 我使用的是 spring graalvm native 版本 0 8 5 和 Spring Boot 版本 2 4 1 我正在尝试使用 sprin
  • aws ec2:如何从ubuntu实例内部知道公共IP [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我创建了一个 amazon web services 实例并使用 Ubuntu 14 04 amazon 机器映像 现在我可以 ssh 进
  • Notepad++ 崩溃后显示空值

    我正在 Notepad 中编辑保存的文件 不幸的是 我没有关闭 Notepad 应用程序 PC 由于电池电量耗尽而断电 当电源重新打开时 我打开我的文件 发现只有 nul nul nul nul nul 这是一个文本文件 我正在其中保存 x
  • 无法在 PowerShell 中将字符串转换为 int

    我正在尝试使用 PowerShell 将字符串转换为整数 然而 它不断告诉我 我没有有效的号码 尽管我确信我有 首先 这是我如何获取变量以及类型的打印输出等 以确保有效性 obj New Object TypeName PSCustomOb
  • 如何使用SQL Server 2008 Reporting Services的WebService

    我创建了一个报表并将其发布到 Report Server 2008 效果很好 我可以打电话http 服务器名称 81 报告在我的浏览器中查看并导出报告 我现在想做的是编写一个应用程序 使用该报告创建一个 Excel 文件 根据 Report
  • 如何根据第一个下拉列表的选择更新第二个下拉列表?

    我有两个 DropDownListFor 助手 第二个的 SelectList 取决于第一个助手中选择的值 因此 我需要做的是 当用户从第一个 DropDownListFor 帮助器中选择一个值时 必须使用正确的值更新第二个 DropDow
  • WPF Button.IsCancel 属性如何工作?

    取消按钮背后的基本思想是通过 Escape 按键关闭窗口 您可以设置 IsCancel 属性 取消按钮设置为 true 导致 取消按钮自动关闭 对话框不处理 Click 事件 来源 WPF 编程 Griffith 销售 所以这应该有效
  • Rails 3 中的类表继承

    我目前正在开发一个 Rails 3 应用程序 它看起来可能需要对几个模型使用类表继承 这是正在发生的事情的一个简化示例 我有一个名为 Person 的类 具有诸如姓名 电子邮件 密码之类的通用属性 这些属性对于应用程序中的所有类型的人来说都
  • Mysql 两个日期时间列之间

    我有以下代码 但它似乎没有产生预期的结果 date from 2012 04 27 18 19 33 date to 2012 05 29 00 59 57 database gt connect ancestors mysql query
  • 想要手动发送SYN ACK数据包来建立TCP连接(如果可能的话在PHP中)

    如何在 php ini 中将自己的 SYN 和 ACK 数据包发送到服务器 我不想让系统做任何事情 我想创建自己的数据包 并自己发送它们以建立 TCP 连接 这可以在 php 中完成吗 或者我是否必须使用 C 来完成此操作 或者可能是 py
  • ForwardRef 警告 React-hook-forms 与 Material UI TextField

    我正在尝试使用 React hook forms 和 Material UI 的输入构建一个表单 在本例中是我的 TextField 的自定义变体 尽管该表单似乎工作完全正常 但在渲染表单时它会在控制台中触发警告消息 警告 不能给函数组件提
  • 在开发模式之外调试 GWT 应用程序?

    我似乎记得在截屏视频中看到有人将 Java 调试器附加到已编译 部署的 GWT 应用程序 这可能吗 我发现一些关于配置一个特殊的 调试模块 来扩展常规模块的稀疏提及 但细节很少 Thanks 您可以使用开发模式来调试已部署的应用程序 但您将
  • Ipython 笔记本:导入脚本函数的名称错误

    我有两个脚本sources py and nest py 他们是这样的 来源 py import numpy as np from nest import def make source rest of the code def detec
  • 如何使当前片段保持在屏幕旋转上

    我试图在一项活动中使用 3 个片段 其中一个片段被设置为默认片段onCreate 方法和其他片段正在通过某些操作进行调用 因此当我旋转屏幕时onCreate 方法再次调用 我当前的片段丢失 默认片段再次开始 但我必须在onCreate 方法
  • 写入csv文件 - python 3.7

    在此输入图像描述 https i stack imgur com xu0F8 png在此输入图像描述 https i stack imgur com uxN1W png在此输入图像描述 https i stack imgur com 0r0
  • 日期减去秒总是返回相同的[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 echo date Y m d H m s strtotime 15 minutes ago br echo date Y m d
  • 在 Qt 中显示解码视频帧的最有效方法是什么?

    将图像显示到 Qt 小部件的最快方法是什么 我已经使用 libavformat 和 libavcodec 解码了视频 因此我已经有了原始 RGB 或 YCbCr 4 2 0 帧 我目前正在使用 QGraphicsView 和包含 QGrap