FFMPEG 之 DXVA2 硬解

news2024/11/16 1:26:36

    一:FFMPEG 支持的硬解方式有很多:
           DXVA2、D3D11VA、CUDA、QSV、OPENCL、DRM、VAAPI、VDPAU、VIDEOTOOLBOX、MEDIACODEC。
           有的支持 Windows 平台,有的支持 linux 平台,有的支持 apple ios 平台,有的支持 android 平台。

   二:Windows 平台,我们可以使用利用 DXVA2、DX11、OpenGL、Vulkan、等技术,直接显示 GPU 显卡中的数据。
          FFPLAY 最新源码,使用 Vulkan 的方式来进行硬解加速渲染的。
          为什么使用 Vulkan ?
             A:Vulkan 跨平台;
             B:Vulkan 可以做渲染;
             C:Vulkan 可以做计算,做图像处理;
             D:Vulkan 可以做视频解码编码;
             E:Vulkan 可以和 CUDA、DRM、VAAPI 互操作;

    三:使用 DXVA2 硬解加速渲染:
           没有了内存复制(av_hwframe_transfer_data)。
           没有了sws_scale 解码到图片也。
           界面绘制由原来的 GDI 绘制,变成了 DX 绘制。
           非常之高效。

    四:Windows 操作系统支持 DXVA2 方式硬解。
            DXVA2 封装了显卡解码。你就不用操心不同显卡了。
            这也是为什么网上介绍硬解时,大多数是介绍 DXVA2 方式硬解。
            当然,如果你的显卡不支持某种格式视频(H265 格式视频)的硬解,即使你使用 DXVA2 硬解,那也是行不通的。

    五:Windows 操作系统支持 DXVA2 方式硬解。
            不使用 FFMPEG 也是可以的。按照 DXVA2 的规范写就可以了。当然这不在本文讨论范围内。
            感兴趣的可以参看:https://github.com/mofo7777/H264Dxva2Decoder.git

    六:我们只要在 FFMPEG 硬解示例程序的基础上,修改硬解方式为 dxva2,就 OK 了。
           其它不用作任何修改。就是 DXVA2 硬解码了。
           当然我们的目的是使用 DX 的方式来渲染图像。

    七:这个 DX 渲染函数很关键。 
           网上绝大多数的代码,都是将 hwcontext_dxva2.c 代码从 FFMPEG 源代码复制出来,
           添加到自己的代码中,并改写为 ffmpeg_dxva2.cpp 。
           其实完全没有这个必要。而且这种方式肯定也是不可取的。
           而且我相信 FFMPEG 的源代码作者肯定也不想你这么干。
           我使用的方法,适用于所有语言。
           20 行的代码就可以完成 DX 绘制了。更具有通用性。
      
    八:DX 渲染函数原理:
          1:用户在调用 av_hwdevice_ctx_create 函数,初始化硬件加速上下文时,
               会调用 hwcontext.c 的 av_hwdevice_ctx_create 函数进行 DXVA2 的初始化。
               av_hwdevice_ctx_create(hwcontext.c) 初始化成功后,将设备上下文信息保存在 data 里面,返回给了调用者;
 

          2:av_hwdevice_ctx_create(hwcontext.c) 会进行 DXVA2 的创建。
               ret = device_ctx->internal->hw_type->device_create(device_ctx, device, opts, flags);
               这里将调用 hwcontext_dxva2.c 的 dxva2_device_create 函数进行 DXVA2 的初始化。
               创建成功后,将 DX 设备信息保存在设备上下文信息的 user_opaque 里面,返回给了调用者。

          3:至此,我们可以拿到:设备上下文信息、DX 设备信息。可以直接进行 DX 界面绘制了。

    九:测试发现:解码效率比网上那些复制改写 hwcontext_dxva2.c 的程序,快了将近 200 多帧。果然高效!!!

    十:核心代码及其说明:          

while ((ret = avcodec_receive_frame(videoCodecCtx, Frame)) >= 0) 
{
    ......
    
    surface    = (LPDIRECT3DSURFACE9)Frame->data[3];                     // 待绘制的数据
    device_ctx = (AVHWDeviceContext*)videoCodecCtx->hw_device_ctx->data; // 设备上下文信息
    priv       = (DXVA2DevicePriv*)device_ctx->user_opaque;              // DX 设备信息

    ......

    /* 开始 DX 渲染 */
    priv->d3d9device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    priv->d3d9device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &BackBuffer);
    RECT SourceRect = { 0, 0, videoCodecCtx->width, videoCodecCtx->height };
    priv->d3d9device->StretchRect(surface, &SourceRect, BackBuffer, NULL, D3DTEXF_LINEAR);
    priv->d3d9device->Present(NULL, NULL, NULL, NULL);

    ......
}


           
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 面向对象进阶 03 static 注意事项、重新认识main方法(黑马)

案例代码如下: 非静态的方法虚拟机会自带一个关键字,如下: 但是不能手动出来,它的类型就是当前类; 通过输出this,得到当前s1,s2 的地址; 所以在输出时会有隐藏的this,所以this所指向…

LaTeX 文本对齐:ragged2e 宏包

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

268. Missing Number(丢失的数字)

题目描述 给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。 问题分析 因为这些数是在[0, n] 范围内的数,我们要是一一标记其是否出现很麻烦,但是我们考虑到如果用所有数的和,减去…

【网络安全|漏洞挖掘】ChatGPT 再曝安全漏洞,被指泄露私密对话

风靡全球的聊天机器人 ChatGPT 近日再次陷入安全风波,被曝泄露用户同机器人的私密对话,其中包含用户名、密码等敏感信息。 ArsTechnica 网站援引其读者提供的截图报道称,ChatGPT 泄露了多段非用户本人的对话内容,包含了大量敏感信…

Web前端入门 - HTML JavaScript Vue

ps:刚开始学习web前端开发,有什么不正确、不标准的内容,欢迎大家指出~ Web简介 90年代初期,Web1.0,静态页面,不和服务器交互,网页三剑客指Dreamweaver、Fireworks、Flash2000年代中期&#xf…

HiveSQL题——数据炸裂和数据合并

目录 一、数据炸裂 0 问题描述 1 数据准备 2 数据分析 3 小结 二、数据合并 0 问题描述 1 数据准备 2 数据分析 3 小结 一、数据炸裂 0 问题描述 如何将字符串1-5,16,11-13,9" 扩展成 "1,2,3,4,5,16,11,12,13,9" 且顺序不变。 1 数据准备 with da…

算法练习-逆波兰表达式求值(思路+流程图+代码)

难度参考 难度:中等 分类:栈与队列 难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。且所在课程未提供测试平台,故实现代码主要为自行测试的那种,以下内容均为个人笔记&#xff0c…

能耗在线监测系统在节能管理中的应用

上海安科瑞电气股份有限公司 胡冠楠 咨询家:“Acrelhgn”,了解更多产品资讯 摘要:开展能耗在线监测系统建设,对加强政府部门和企业节能管理中的应用前景,分析系统在能源消费预测分析、能效对标、节能监察、能源精细化…

【Oracle云】OCI DevOps Services 构建自动化流水线 (1) - 基础架构流程 OCI 代码仓库使用

OCI DevOps Services 是 Oracle Cloud Infrastructure (OCI) 提供的一项独立的 CI/CD 服务,旨在支持用户构建自动化的流水线,实现更高效、可靠的软件交付。在本系列的第一篇文章中,我们将深入探讨 OCI DevOps Services 的基础架构流程&#x…

探索设计模式的魅力:精准解读桥接模式-用桥接模式构建可扩展的软件系统

设计模式专栏:http://t.csdnimg.cn/nolNS 目录 一、了解桥接模式:探索抽象和实现的分离 1.1 开-闭原则 1.2 组合/聚合复用原则 1.3 定义 1.4 用意 1.5 基本思想 1.6 组成部分 1.7 桥梁模式的示意性系统的结构图 二、桥接模式的优势&#xff1a…

RK356X RKAndroid12 TF卡配置 自动挂载

RK356X RKAndroid12 TF卡配置 自动挂载 RK3568 有三个SDMMC接口&#xff0c;分别为SDMMC0 SDMMC1 SDMMC2 DTS 配置 1. max-frequency <150000000>; 此配置设置 SD 卡的运行频率&#xff0c;虽然设置为 150M &#xff0c;但是还要根据 SD 卡的不同模式进行调整。这…

C语言系列-浮点数在内存中的存储

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 浮点数在内存中的存储 浮点数的存储 浮点数存的过程 浮点数取的过程 题目解析 浮点数在内存中的存储 常见的浮点数&#xff1a;3.14159.1E10等&#xff0c;浮点数家族包括&…

使用websocket后端接入文心一言

最近再写项目练手&#xff0c;想着最近大模型那么火&#xff0c;也想接入项目来玩一玩&#xff0c;于是去了解了一下相关的api和通信协议&#xff0c;最后选择了文心一言进行集成&#xff0c;国内的相对稳定。ERNIE-Bot-turbo - 千帆大模型平台 | 百度智能云文档 (baidu.com) …

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索 效果图定义子组件父组件应用 效果图 定义子组件 主要结合el-select和el-tree两个组件改造的。 <template><div class"selectTree"><el-select filterable :filter-method"filterMe…

AI学习(4): PyTorch实战-手写数字识别

1.介绍 在之前的文章中介绍了PyTorch的环境安装&#xff0c;和张量(tensor)的基本使用&#xff0c;为防止陷入枯燥的理论学习中&#xff0c;在这篇文章&#xff0c;我们将进行项目实战学习&#xff0c;项目主要内容: 基于MNIST数据集&#xff0c;实现一个手写数字识别的神经网…

基于OpenCV的高压电力检测项目案例

一、项目背景与目标 随着高压电力设施的日益增多&#xff0c;传统的巡检方式已无法满足现代电力系统的需求。为此&#xff0c;我们决定利用计算机视觉技术&#xff0c;特别是OpenCV库&#xff0c;开发一个高压电力检测系统。目标是实现自动化、高精度的电力设备检测&#xff0c…

《动手学深度学习(PyTorch版)》笔记4.8

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

get out of black background

文章目录 基础 Sequence settings (after selected a Sequence) 看见 ( 让Pr表示透明 ) Effects-> Color Key, drag into your Sequence >.如果看不到 Effects 面板, 可以在 Window 菜单中打开 在Effect Controls 你可以调整 Color Key 的效果了先吸取黑色 还可以使用ma…

Python笔记(二)—— Python判断语句

2.1 布尔类型和比较运算符 布尔类型用于表示&#xff1a;真和假 比较运算符用于计算&#xff1a;真和假 1. 布尔&#xff08;bool&#xff09;表示现实生活中的逻辑&#xff0c;即真和假 True表示真False表示假 True本质上是一个数字记作1&#xff0c;False记作0 定义变…

17.Golang channel的基本定义及使用

目录 概述实践无缓冲 channel代码结果 缓冲 channel代码结果 channel的关闭特点代码结果range代码结果 select channel代码结果 结束 概述 此篇文章介绍 channel 的用法 无缓冲 channel缓冲 channelchannel的关闭特点range channelselect channel 每一种&#xff0c;配上完整…