AVFrame 到 QImage 的高效转换

2024-03-31

我需要在基于 Qt 的应用程序中从视频中提取帧。使用 ffmpeg 库,我可以将帧作为 AVFrame 获取,我需要将其转换为 QImage 以在应用程序的其他部分中使用。这种转换必须是高效的。到目前为止看来sws_scale()是正确使用的函数,但我不确定要指定什么源和目标像素格式。


提出了以下两步过程,首先转换解码的AVFame到另一个AVFrame在 RGB 色彩空间中,然后QImage。它有效并且相当快。

src_frame = get_decoded_frame();

AVFrame *pFrameRGB = avcodec_alloc_frame(); // intermediate pframe
if(pFrameRGB==NULL) {
    ;// Handle error
}

int numBytes= avpicture_get_size(PIX_FMT_RGB24,
      is->video_st->codec->width, is->video_st->codec->height);
uint8_t *buffer = (uint8_t*)malloc(numBytes);

avpicture_fill((AVPicture*)pFrameRGB, buffer, PIX_FMT_RGB24,
              is->video_st->codec->width, is->video_st->codec->height);

int dst_fmt = PIX_FMT_RGB24;
int dst_w = is->video_st->codec->width;
int dst_h = is->video_st->codec->height;

// TODO: cache following conversion context for speedup,
//       and recalculate only on dimension changes
SwsContext *img_convert_ctx_temp;
img_convert_ctx_temp = sws_getContext(
is->video_st->codec->width, is->video_st->codec->height,
is->video_st->codec->pix_fmt,
dst_w, dst_h, (PixelFormat)dst_fmt,
SWS_BICUBIC, NULL, NULL, NULL);


QImage *myImage = new QImage(dst_w, dst_h, QImage::Format_RGB32);

sws_scale(img_convert_ctx_temp,
          src_frame->data, src_frame->linesize, 0, is->video_st->codec->height,
          pFrameRGB->data,
          pFrameRGB->linesize);

uint8_t *src = (uint8_t *)(pFrameRGB->data[0]);
for (int y = 0; y < dst_h; y++)
{
    QRgb *scanLine = (QRgb *) myImage->scanLine(y);
    for (int x = 0; x < dst_w; x=x+1)
    {
        scanLine[x] = qRgb(src[3*x], src[3*x+1], src[3*x+2]);
    }
    src += pFrameRGB->linesize[0];
}

如果您找到更有效的方法,请在评论中告诉我

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

AVFrame 到 QImage 的高效转换 的相关文章

随机推荐

  • 寻找最小组件集合的算法

    我正在寻找一种算法来解决以下问题 我有给定集合 a h 的多个子集 1 n 我想找到最小的子集集合 它允许我通过组合来构造所有给定的子集 该集合可以包含 1 n 中尚不存在的子集 a b c d e f g h 1 1 2 1 1 3 1
  • 状态栏在 ionic 3 中不起作用

    我是 IONIC 3 的新手 我只想在我的应用程序中实现状态栏 我尝试了以下方法 import App Nav Platform Events AlertController from ionic angular import Status
  • 在 iframe 加载之前运行脚本

    我正在使用嵌入在应用程序中的帮助系统 帮助的重要部分尝试具有相同的 document domain 值 但子 iframe 似乎在父 iframe 之前运行其 document domain 设置 这是一个问题 因为它会引发安全错误并停止
  • 无法注册 PS 图库

    我读了很多论坛并尝试了很多东西 但我就是无法添加PS图库 我使用公司代理 但我已设置我的个人资料以使用它 我正在尝试使用这些命令注册 PS 存储库 Net ServicePointManager SecurityProtocol Net S
  • bash 如何处理嵌套引号? [复制]

    这个问题在这里已经有答案了 我需要使用如下语法运行命令 runuser l userNameHere c path to command arg1 arg2 不幸的是 我必须嵌套额外的 字符到命令本身中 我无法告诉 bash 正确解释这些字
  • Web:我什么时候应该考虑使用 Java 而不是 PHP、Python/Django、Ruby/Rails 等?

    如果收集中型到大型基于 Web 的项目的需求 在什么时候应该考虑使用基于 Java 的后端 JSP 等 而不是 PHP Python 或 Ruby 等脚本语言 听到 使用正确的工具 Java 什么时候是基于 Web 的项目的正确工具 什么是
  • 性能:条件测试与分配

    我创建了一个循环 其中使用变量来测试循环的当前运行是否是第一个循环 它相当简单 firstrun true while condition if firstrun Do this else Do that Change firstrun t
  • 未安装模拟器 - Android Studio

    我的 android studio 工作正常 有点慢 但工作正常 但是当我几天前启动它并尝试运行时 它开始向我显示错误 未安装模拟器 请帮我 找不到任何合适的解决方案 不用担心 只需打开 SDK Manager 在 Android Stud
  • Runtime.getRuntime().availableProcessors() 在容器优化操作系统上始终返回 1

    我正在 GCP 上的 kubernetes 引擎上部署 Elasticsearch 但遇到了性能问题 Elasticsearch根据核心数量确定各种线程池的大小 尽管我创建了一个 32 核 VM 但线程池大小仅为 1 我确实编写了一个测试程
  • 如何对 IP 地址列表进行排序并计算每个地址的类别和网络掩码? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有两个选择 一是我有一个包含 IP 列表的数组 例如 my Ip array that has the IPs below in it
  • AWS Glue 中 s3fs 库导入失败

    AWSglue不导入s3fs模块 import s3fs 我希望导入该库 但 AWSglue 说 导入错误 没有名为 s3fs 的模块 AWS Glue 作业预装了一些常用库 但除此之外 您还需要下载 whl对于 pypi 的库 在这种情况
  • Woocommerce 更改购买时的用户角色

    我正在尝试使用这段代码将我的用户从默认角色 订阅者 更新为从我的商店购买产品时的 高级 角色 add action woocommerce order status completed change role on purchase fun
  • 如何使用 GPU 使用 tf.lite.Interpreter(在 python 中)运行 tflite 模型 (*.tflite)?

    我已根据以下说明将张量流推理图转换为 tflite 模型文件 tflite https www tensorflow org lite convert https www tensorflow org lite convert 我在我的 G
  • Javascript - 字符串连接[重复]

    这个问题在这里已经有答案了 我有这个功能 javascript function popup mylink windowname w h if window focus return true var href if typeof myli
  • 如何记住终端中多个选项卡的会话? (类似于 FF 会话管理器)

    一个人如何 撤消关闭选项卡 在终端中 与它非常相关的是 是否有可能记住终端中的选项卡会话 我的意思是 与 Firefox 类似 如果我关闭特定终端窗口中的所有选项卡 第二天如何打开相同的选项卡 对于像我这样经常使用多个选项卡的人来说 记住终
  • 致命异常主要 Android 应用程序

    我目前正在开发 Android 应用程序 当我单击菜单时 菜单会显示 但如果您选择 首选项 它就会崩溃 如果您单击 新建 则效果很好 我不知道发生了什么事 我是 Android 应用程序开发和 eclipse IDE 的新手 所以任何东西都
  • 如何编写 Linux .dts 设备树文件?

    我要在我的开发板上启动Linux 我需要一个dts文件 设备树文件 来描述整个硬件 但我对这个文件的语法知之甚少 不足以在板上正确运行Linux 我现在所知道的只是如何描述一个单元的中断号 频率 地址 父单元及其兼容的驱动程序类型 如下所述
  • 如何在rails 2.3.3中有条件地分配ActionController::Base.session

    我有一个 Rails 应用程序 在 config initializers session store rb 文件中包含以下内容 ActionController Base session key gt app session secret
  • WPF:将标签绑定到类属性

    我试图将标签的内容绑定到类实例的字符串属性 但没有取得太大成功 XAML
  • AVFrame 到 QImage 的高效转换

    我需要在基于 Qt 的应用程序中从视频中提取帧 使用 ffmpeg 库 我可以将帧作为 AVFrame 获取 我需要将其转换为 QImage 以在应用程序的其他部分中使用 这种转换必须是高效的 到目前为止看来sws scale 是正确使用的