播放器开发之ffmpeg 硬件解码方案

硬件编解码的概念

硬件编解码是⾮CPU通过烧写运⾏视频加速功能对⾼清视频流进⾏编解码,其中⾮CPU可包括GPU、FPGA或者 ASIC等独⽴硬件模块,把CPU⾼使⽤率的视频解码⼯作从CPU⾥分离出来,降低CPU的使⽤负荷,使得平台能 ⾼效且流畅的执⾏视频的编解码动作。

软件编解码的概念

软件编解码指的是在信息传输的过程中,视频等信号直接通过CPU进⾏编解码。如此⽽来,会增加CPU的⼯作 负荷,提升功耗,如果CPU能⼒不⾜,则软件也会受到⼀定程度的影响。 由于CPU拥有更强⼤的计算能⼒以及更精确的数据位宽,因此CPU能更好地兼容各种编解码的⼯作。

总结一下硬件编解码和软件编解码的优缺点:

硬件编解码的优点:

  1. 可以分离出音视频编解码的工作,少量占用CPU资源

  2. 编解码性能更高,同等条件下速度更快

  3. 同等条件下,硬件编解码的功耗更低

硬件编解码的缺点:

  1. 软件支持度不如软件编解码,起步较晚

  2. 由于硬件功能性限制,兼容性较低

  3. 在画面输出补偿、画质增强等技术方面有一定缺陷

  4. 需要独立进行硬件设置,对小白用户不太友好

软件编解码的优点:

  1. 编解码器更易于开发,协议兼容度更高

  2. 拥有更多画面输出补偿和画质增强技术,画质更优

软件编解码的缺点:

  1. 对CPU性能要求较高,在高帧率游戏或高清视频播放时CPU负担较重

GPU编解码的常⽤技术⽅案

对应gpu编解码编程,硬件⼚家都有相应SDK⽅案,应⽤开发者可以直接调⽤⼚家的SDK 来完成编解码器⼯作。

FFmpeg⽅案

Windows的d 3 d 11 va 屏蔽不同的gpu。

ffmpeg对⼚家/或平台SDK进⾏封装和集成,实现部分的硬件编解码。主要关注nvida和Intel的⽅案

许多硬件解码器的⼀个共同特点是能够在适合其他组件使⽤的硬件表⾯中⽣成输出(对于独⽴显卡,这意味着表 ⾯在卡上的内存中⽽不是在系统内存中)—— 这通常对播放很有⽤,因为在呈现输出之前不需要进⼀步复制,并 且在某些情况下,它还可以与⽀持硬件表⾯输⼊的编码器⼀起使⽤,以避免在转码情况下进⾏任何复制 (Darren注:从gpu拷⻉数据到内存,和内存拷⻉数据gpu都⽐较耗时)。

硬件编码器⽣成的输出质量通常⽐好的软件编码器(如 x 264 )低,但通常速度更快并且不使⽤太多 CPU 资源。

使用ffmpeg查看⽀持的可⽤硬件加速

ffmpeg -hwaccels​

代码使用

注册阶段

1通过 av_hwdevice_find_type_by_name() 根据名称自动寻找硬件解码 API 如 "qsv"、"cuvid"、"d3d11va"、"dxva2"等

2使用 avcodec_get_hw_config 找到对应的硬件解码格式回调 cuda -> cuvid 解码器 ->h264_nvenc

3将解码器格式赋值为硬件解码格式

4创建硬件设备上下文 av_hwdevice_ctx_create

使用阶段

5进行硬件解码 avcodec_send_packet avcodec_receive_frame 6转换硬件解码的数据 av_hwframe_transfer_data() 从 GPU 内存转移到 CPU 内存中

下图所示(选取参考文献):

硬解init

if(m_isHw_device && stream_index == AVMEDIA_TYPE_VIDEO)
{// 初始化硬件解码器(在avcodec_open2前调用)if(initHWDecoder(avctx,codec) < 0){msg_queue_->notify_msg(FFP_MSG_VIDEO_HW_DECODE_NONE);}
}
if ((ret = avcodec_open2(avctx, codec, NULL)) < 0) {goto fail;
}int FFPlayer::initHWDecoder(AVCodecContext*avctx, const AVCodec *codec)
{if(!avctx && !codec) return -2;enum AVHWDeviceType type = av_hwdevice_find_type_by_name(hw_device_type.data()); // 根据名称自动寻找硬解码if (type == AV_HWDEVICE_TYPE_NONE){return -1;}//2.获取编码器支持的硬件配置:for(int i = 0; ; i++){const AVCodecHWConfig* config = avcodec_get_hw_config(codec, i);    // 检索编解码器支持的硬件配置。if(!config){LOG(ERROR)<< "打开硬件解码器失败!";m_isHw_device = false;hw_device_type.clear();return -1;          // 没有找到支持的硬件配置}if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX&&  config->device_type == type)       // 判断是否是设备类型{hw_pix_fmt = config->pix_fmt;LOG(INFO) << "打开硬件解码器:" << av_hwdevice_get_type_name(config->device_type);// 打开指定类型的设备,并为其创建AVHWDeviceContext。int ret = av_hwdevice_ctx_create(&hw_device_ctx, config->device_type, nullptr, nullptr, 0);if(ret < 0){fprintf(stderr, "Failed to create specified HW device.\n");return ret;}avctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);  // 创建一个对AVBuffer的新引用。avctx->get_format = get_hw_format;                    // 由一些解码器调用,以选择将用于输出帧的像素格式return 1;}}return -1;
}

硬解后数据获取

从gpu拿解码数据

//硬解2 从硬件buffer拷贝的内存来
//这里可以考虑直接使用frame给显存显示, 这里如果开启耗时增加%75左右
if(is->m_isHw_device){hw_frame = av_frame_alloc();if(hw_decoder_gpu_tocpu_copy(hw_frame,frame) < 0)tmp_frame = frame;elsetmp_frame = hw_frame;
}
else{tmp_frame = frame;
}int Decoder::hw_decoder_gpu_tocpu_copy(AVFrame *dst, AVFrame *src)
{if (src->format == is->hw_pix_fmt){av_hwframe_map在ffmpeg3.3以后才有,经过测试av_hwframe_transfer_data的耗时大概是av_hwframe_map的【1.5倍】int ret = av_hwframe_transfer_data(dst, src, 0);                   // 映射硬件数据帧//  av_hwframe_map()if(ret < 0){LOG(ERROR)<<"av_hwframe_map failt " << is->hw_pix_fmt;return -1;}} else{dst = src;}return 1;
}

总结

把解码当成解压缩文件,压缩算法越高级,得到的文件内存占用量就少。但是cpu使用率就高,硬件解码也是同一道理。

硬件编解码器与软件编解码器的对比:

  1. 输出质量:

    • 硬件编解码器的输出质量通常低于优质的软件编解码器(如x264)。

    • 为了达到相同的感知质量,硬件编解码器需要更高的码率。

    • 在相同码率下,软件编解码器的输出质量通常更好。

  2. 性能和效率:

    • 硬件编解码器的编解码速度更快,同时也更节省CPU资源。

    • 这使其更适合实时视频编解码的应用场景。

  3. 功能支持:

    • 硬件编解码器往往只支持编解码器的部分功能配置,而不是全部比如本机有qsv硬件,但是没有qsv对应的专属解码器程序,导致解码失败。

    • 例如在H.264编码中,可能只支持8位4:2:0格式,而不支持更复杂的配置。

  4. 硬件表面输出:

    • 硬件编解码器可以直接在显卡显存中生成输出表面。

    • 这避免了从GPU到系统内存的数据拷贝,提高了效率。

    • 还可以与支持硬件表面的编码器配合使用,消除转码过程中的数据拷贝。

  5. API支持:

    • 不同的硬件编解码器可能支持不同的API标准,如VAAPI、NVIDIA NVDEC/NVENC等。

    • FFmpeg等工具可以提供对这些API的访问能力。

综上所述,硬件编解码器在性能和效率方面有优势,但在输出质量和功能支持上可能略逊于优秀的软件编解码器。选择时需要权衡具体的应用需求。

测试

测试4k影片,正常播放30s,本次测试保留了从gpu到cpu拷贝到缓存队列,如果直接将gpu转给显存,性能将大幅提升。

不使用硬解后 cpu使用率波动15-25左右

使用硬解后 cpu使用率 波动 7-18左右

参考文献

Qt-FFmpeg开发-视频播放【硬解码】(2) - mahuifa - 博客园

学习资料分享

0voice · GitHub

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

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

相关文章

DDD领域应用理论实践分析回顾

目录 一、DDD的重要性 &#xff08;一&#xff09;拥抱互联网黑话&#xff08;抓痛点、谈愿景、搞方法论&#xff09; &#xff08;二&#xff09;DDD真的重要吗&#xff1f; 二、领域驱动设计DDD在B端营销系统的实践 &#xff08;一&#xff09;设计落地步骤 &#xff0…

读懂top后显示内容

第一行&#xff1a;系统信息 top - 06:33:12 up 42 min, 1 user, load average: 0.04, 0.02, 0.00 06:33:12&#xff1a;当前时间。up 42 min&#xff1a;系统已经启动了 42 分钟。1 user&#xff1a;当前有 1 个用户登录。load average: 0.04, 0.02, 0.00&#xff1a;这三个…

2024年第十四届APMCM亚太杯数学建模A题B题C题思路+代码解析汇总

2024年第十四届亚太地区大学生数学建模竞赛 开赛后第一时间更新解题思路代码参考文章&#xff01; 点击链接加入群聊【2024亚太杯数学建模竞赛助攻】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&ksIq03p_73AYtWuH-bNy6VGD2652Um6y2&authKeyZsYwQzbxX0BKPyH…

Tomcat 如何管理 Session

Tomcat 如何管理 Session 我们知道&#xff0c;Tomcat 中每一个 Context 容器对应一个 Web 应用&#xff0c;而 Web 应用之间的 Session 应该是独立的&#xff0c;因此 Session 的管理肯定是 Context 级的&#xff0c;也就是一个 Context 一定关联多个 Session。 Tomcat 中主…

【ArcGISPro】使用AI模型提取要素-提取车辆(目标识别)

示例数据下载 栅格数据从网上随便找一个带有车辆的栅格数据 f094a6b1e205cd4d30a2e0f816f0c6af.jpg (1200799) (588ku.com) 添加数据

SpringBoot3_Web开发

4. 内容协商 一套系统适配多端数据返回 移动端&#xff1a;返回JSON数据第三方&#xff1a;返回XMLIoT&#xff1a;返回自定义协议数据 1. 默认规则 1. SpringBoot 多端内容适配 基于请求头内容协商 【默认】 客户端向服务端发送请求&#xff0c;携带HTTP标准的 Accept 请求…

Mysql篇-语句执行计划详解(explain)

概述 使用 explain 输出 SELECT 语句执行的详细信息&#xff0c;包括以下信息&#xff1a; 表的加载顺序 sql 的查询类型 可能用到哪些索引&#xff0c;实际上用到哪些索引 读取的行数 Explain 执行计划包含字段信息如下&#xff1a;分别是 id、select_type、table、partit…

.net 7.0 解决“The keyword field is required”的问题

在 .net 3.1项目的时候&#xff0c;使用 keyword 做 API 接口的模糊匹配&#xff0c;能够传入keyword “” 进行整表查询。但当我在 .net 7.0 项目中这么使用的时候&#xff0c;传入 keyword 不为空时能够进行匹配&#xff0c;但是当我传入 keyword “” 的时候就报错 “The …

高效语言模型 Parler-TTS 上线,一键完成文本转语音

Parler-TTS 是一种轻量级的文本转语音 (TTS) 模型&#xff0c;可以生成具有给定说话者风格的高质量、自然语音&#xff0c;自由度及创新性非常高&#xff0c;并且可以通过 Prompt 控制说话者的性别、音色、语调以及所处的场景&#xff08;室内、室外、马路上、音乐厅等&#xf…

网络安全与防范

1.重要性 随着互联网的发达&#xff0c;各种WEB应用也变得越来越复杂&#xff0c;满足了用户的各种需求&#xff0c;但是随之而来的就是各种网络安全的问题。了解常见的前端攻击形式和保护我们的网站不受攻击是我们每个优秀fronter必备的技能。 2.分类 XSS攻击CSRF攻击网络劫…

JavaWeb——Maven、web入门

1. maven maven是一款用于管理和构建Java项目的工具&#xff0c;它基于项目对象模型&#xff08;POM—Project Object Model&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的构建。 1.1. 作用 1.1.1. 依赖管理 方便快捷的管理项目依赖的资源&#xff08;jar包…

【前端学习笔记】Javascript学习二(运算符、数组、函数)

一、运算符 运算符&#xff08;operator&#xff09;也被称为操作符&#xff0c;是用于实现赋值、比较和执行算数运算等功能的符号。 JavaScript中常用的运算符有&#xff1a; 算数运算符、递增和递减运算符、比较运算符、逻辑运算符、赋值运算符 算数运算符&#xff1a; 、-…

【开源免费】基于Vue和SpringBoot的智慧食堂系统(附论文)

本文项目编号 T 629 &#xff0c;文末自助获取源码 \color{red}{T629&#xff0c;文末自助获取源码} T629&#xff0c;文末自助获取源码 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和电子化。网…

基因组之全局互作热图可视化

引言 PlotHiC 是一个专为 Hi-C 数据可视化分析而设计的 Python 包。Hi-C 技术是一种能够检测染色体三维结构的实验方法&#xff0c;它能揭示 DNA 在细胞核内的三维组织结构。为了更好地展示和解释这些复杂的数据&#xff0c;PlotHiC[1] 可以帮助用户方便地绘制Hi-C 数据的热图。…

道本科技智慧合同管理平台,采用数字化技术帮助企业建立全生命周期的合同管理模式。

作为专业的企业合同管理平台建设专家&#xff0c;我们拥有丰富的实施经验和专业技术团队&#xff0c;致力于帮助企业搭建高效、安全的合同管理系统。我们的解决方案涵盖合同起草、审批、存储、分析和报告等多个环节&#xff0c;能够满足不同企业的多样化需求。 选择我们&#…

AmazonS3集成minio实现https访问

最近系统全面升级到https&#xff0c;之前AmazonS3大文件分片上传直接使用http://ip:9000访问minio的方式已然行不通&#xff0c;https服务器访问http资源会报Mixed Content混合内容错误。 一般有两种解决方案&#xff0c;一是升级minio服务&#xff0c;配置ssl证书&#xff0c…

QGIS使用WMS图层

目录 参考链接 参考链接 [1] 使用 WMS 数据 &#xff08;QGIS3&#xff09; 2023.8&#xff1b;

华为防火墙技术基本概念学习笔记

1.防火墙概述 1.1防火墙与交换机、路由器对比 路由器与交换机的本质是转发&#xff0c;防火墙的本质是控制。 防火墙与路由器、交换机是有区别的。路由器用来连接不同的网络&#xff0c;通过路由协议保证互联互通&#xff0c;确保将报文转发到目的地;交换机则通常用来组建局域…

面向FWA市场!移远通信高性能5G-A模组RG650V-NA通过北美两大重要运营商认证

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;其旗下符合3GPP R17标准的新一代5G-A模组RG650V-NA成功通过了北美两家重要运营商认证。凭借高速度、大容量、低延迟、高可靠等优势&#xff0c;该模组可满足CPE、家庭/企业网关、移动热点、高清视频…

idea maven 重新构建索引

当设置maven仓库为离线模式的时候&#xff0c;会出现一些问题。 比如本地的仓库被各种方式手动更新之后&#xff0c; 举例&#xff1a;我需要一个spring的包&#xff0c;在pmo文件中写好了引入包的代码 但是由于是离线模式没有办法触发自动下载&#xff0c;那么这个时候我可以…