FFMPEG 之 DXVA2 硬解

    一: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);

    ......
}


           
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI视野·今日NLP 自然语言处理论文速览 第七十七期】Mon, 15 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 15 Jan 2024 Totally 57 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Machine Translation Models are Zero-Shot Detectors of Translation Direction Authors Michelle Wastl, Ja…

手动上传文件

代码: import { Button, UploadProps, Upload, message } from antd; import { UploadOutlined } from ant-design/icons;const MyUpload: React.FC () > {const props: UploadProps {name: jpgFile,action: /xxxxx/xx/接口,headers: {authorization: token,}…

Python正则表达式语法

正则表达式是一种强大的文本处理工具,它可以用来搜索、匹配和替换特定的字符模式。在Python中,正则表达式常常被用于处理字符串数据,例如文本搜索、数据提取、格式验证等任务。本文将深入介绍Python中正则表达式的语法,帮助读者全…

ElasticSearch 应用实践 笔记

概述 介绍 ES 是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心。它可以近乎实时的存储,检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。ElasticSearch的底层是开源库Lu…

CRG设计之时钟

1. 前言 CRG(Clock and Reset Generation,时钟复位生成模块) 模块扮演着关键角色。这个模块负责为整个系统提供稳定可靠的时钟信号,同时在系统上电或出现故障时生成复位信号,确保各个模块按预期运行。简而言之,CRG模块就像是SoC系…

MySQL-DQL(Data Query Language)数据查询语言

文章目录 1. DQL定义2. 基础查询3. 条件查询(WHERE)4. 分组查询(GROUP BY)5. 过滤分组(HAVING)6. 排序(ORDER BY)7. 限制查询结果的条数(LIMIT)8. 多表查询8.…

Unity_Visual Effect Graph

Unity_Visual Effect Graph Unity可视化特效渲染虽不及Unreal Engine,然也还是吊打一众其他引擎的,粗浅整理一波吧,需要深入研究的点实在是太多了。 按照常规包管理方式安装Visual Effect Graph插件: 安装之后,示例文件夹中自带资源,拖入场景即可: 场景只是资源的显…

Vue学习Element-ui

声明:本文来源于黑马程序员PDF讲义 Ajax 我们前端页面中的数据,如下图所示的表格中的学生信息,应该来自于后台,那么我们的后台和前端是 互不影响的2个程序,那么我们前端应该如何从后台获取数据呢?因为是2…

Tensorflow2.0笔记 - where,scatter_nd, meshgrid相关操作

本笔记记录tf.where进行元素位置查找,scatter_nd用于指派元素到tensor的特定位置,meshgrid用作绘图的相关操作。 import tensorflow as tf import numpy as np import matplotlib.pyplot as plttf.__version__#where操作查找元素位置 #输入的tensor是Tr…

问题:第十三届全国人民代表大会第四次会议召开的时间是()。 #经验分享#知识分享#媒体

问题:第十三届全国人民代表大会第四次会议召开的时间是()。 A. 2018年3月3日至3月11日 B. 2019年3月5日至3月11日 C. 2020年3月5日至3月11日 D. 2021年3月5日至3月11日 参考答案如图所示 问题:顾客满意是顾客对一件产品满足…

EDR、SIEM、SOAR 和 XDR 的区别

在一个名为网络安全谷的神秘小镇,居住着四位守护者,他们分别是EDR(艾迪)、SIEM(西姆)、SOAR(索亚)和XDR(艾克斯)。他们各自拥有独特的能力,共同守…

中国城乡建设统计年鉴,pdf、xls格式,时间覆盖2002-2022年

基本信息: 数据名称: 中国城乡(市)建设统计年鉴 数据格式: pdf、xls不定 数据时间: 2002-2022年 数据几何类型: 文本 数据坐标系: —— 数据来源:住房和城乡建设部 2005年之后数据中有《中国城市建设统计年鉴》、《中…

node,node-sass,sass-loader之间的版本关系

前言 安装配置node-sass 以及 sass-loader想必是很多前端的噩梦–一不小心又不成功还得装个半天。 下面说一下这个问题。 当然,你肯定遇到过: Node Sass version 9.0.0 is incompatible with ^4.0.0-这样的问题,这个也是因为三者关系对不上…

SpringMVC-基本概念

一、引子 我们在上篇文章Spring集成Web中抛出了一个问题:为什么我们一直在自用Java Web阶段使用的Servlet来承接客户端浏览器的请求呢,我们熟知甚至是已经在日常开发中经常使用的Controller又与之有什么关系呢?我们将在本篇文章解答读者的这…

怎么使用cmd命令来进行Vue脚手架的项目搭建

前言 使用vue搭建项目的时候,我们可以通过对应的cmd命令去打开脚手架,然后自己配置对应的功能插件 怎么打开 我们打开对应的cmd命令之后就开始进入对应的网站搭建 vue ui 然后我们就打开对应的项目管理器来进行配置----这里我们打开开始创建新的项目…

鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级

在2023年云栖大会上,阿里云数据库产品事业部负责人李飞飞在主题演讲中提到,瑶池数据库推出“DB存储”一体化能力,结合人工智能、机器学习、存储等方法和创新能力,实现Buffer Pool Extension能力和智能冷温热数据分层能力。在大会的…

springboot139华强北商城二手手机管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

使用post-css实现移动端适配

介绍移动端适配以及适配方案 适配原因 移动端不像PC端,有足够大的屏幕展示较多的内容不同的移动端设备,有不同屏幕宽度同样大小的页面元素在不同屏幕宽度设备展示时,布局就会错乱有些元素没有展示在可视范围内有些元素不能撑满整个屏幕&#xf…

RISC-V指令格式

RISC-V指令格式 1 RISC-V指令集命名规范2 RISC-V指令集组成2.1 基础整数指令集2.2 扩展指令集 3 RISC-V指令格式3.1 指令表述3.2 指令格式 本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 RISC-V指令集命名规范 前面提到过RV32I,这是…

ArcGIS雨涝风险模拟

所谓雨涝模拟分析, 就是模拟降雨量达到一定强度, 城市的哪些区域容易被淹没形成内涝。 雨涝模拟更重要的是提前预测, 可在预测结果的基础上进行实地勘察, 为项目规划、风险防控等工作提供指导作用。 雨涝模拟的原理和思想多种…