Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >FFmpeg 硬件加速方案概览 (上)

FFmpeg 硬件加速方案概览 (上)

作者头像
LiveVideoStack
发布于 2021-09-02 03:18:27
发布于 2021-09-02 03:18:27
2.4K0
举报
文章被收录于专栏:音视频技术音视频技术

被称为“多媒体技术领域的瑞士军刀”,FFmpeg拥有广泛的应用基础。不过,当(实时)处理海量视频时,需要借助各种方法提升效率。比如,短视频平台Revvel视频转码服务迁移到AWS Lambda和S3上,节省了大量费用和运维成本,并且将时长2小时的视频转码从4-6小时缩短到不到10分钟。本文将纵览FFmpeg的硬件加速方案,涉及各主流硬件方案和操作系统。感谢英特尔资深软件开发工程师赵军的投稿。

文 / 赵军

多媒体应用程序是典型的资源密集型应用,因此优化多媒体应用程序至关重要,这也是使用视频处理专用硬件加速的初衷。作为回报,这允许整个系统更加有效地运行(以达到最佳性能)。 但是为了支持硬件加速,软件开发厂商面临着各种挑战:一个是存在潜在的系统性能风险问题;此外,软件开发商一直也因为要面对各种硬件架构的复杂性而苦苦挣扎,并需要维护不同的代码路径来支持不同的架构和不同的方案。优化这类代码,耗时费力。想想你可能需要面对不同的操作系统,诸如LinuxWindows,macOS,AndroidiOS,ChromeOS;需要面对不同的硬件厂商,诸如Intel,NVIDIA,AMD,ARM,TI, Broadcom……,因此,提供一个通用且完整的跨平台,跨硬件厂商的多媒体硬件加速方案显得价值非凡。

专用视频加速硬件可以使得解码,编码或过滤(Filter)等操作更快完成且使用更少的其他资源(特别是CPU),但可能会存在额外的限制,而这些限制在仅使用软件CODEC时一般不存在。在PC平台上,视频硬件通常集成到GPU(来自AMD,Intel或NVIDIA)中,而在移动SoC类型的平台上,它通常是独立的IP核(存在着许多不同的供应商)。硬件解码器一般生成与软件解码器相同的输出,但使用更少的Power和CPU来完成解码。另外,各种硬件支持的Feature也各不相同。对于具有多种不同Profile的复杂的CODEC,硬件解码器很少实现全部功能(例如,对于H.264,硬件解码器往往只支持8bit的YUV 4:2:0)。

许多硬件解码器的一个共同特点是能够输出硬件Surface,而该Surface可以被其他组件进一步使用(使用独立显卡时,这意味着硬件Surface在GPU的存储器中,而非系统内存) ,对于播放(Playback)的场景,避免了渲染输出之前的Copy操作;在某些情况下,它也可以与支持硬件Surface输入的编码器一起使用,以避免在转码(transcode)情况下进行任何Copy操作。另外,通常认为硬件编码器的输出比x264等优秀软件编码器质量差一些,但速度通常更快,且不会占用太多的CPU资源。也就是说,他们需要更高的比特率来使输出相同的视觉感知质量,或者他们以相同的比特率以更低的视觉感知质量输出。具有解码和/或编码能力的系统还可以提供其他相关过滤(Filter)功能,比如常见的缩放(scale)和去隔行(deinterlace);其他后处理(postprocessing)功能可能取决于系统。

FFmpeg所支持的硬件加速方案,粗略以各OS厂商和Chip厂商特定方案以及行业联盟定义的标准来分为3类;其中,OS涉及Windows,Linux,macOS,Android;Chip厂商的特定方案涉及到Intel,AMD,Nvidia等;而行业标准则着重OpenMAX与OpenCL ;这只是一个粗略的分类,很多时候,这几者之间纵横交错,联系繁杂,之间的关系并非像列出的3类这般泾渭分明;这从另一个侧面也印证了硬件加速方案的复杂性。就像我们熟知的大部分事情一样,各种API或解决方案一面在不断的进化同时,它们也背负着过去的历史,后面的分析中也可以或多或少的窥知其变迁的痕迹。

1.基于OS的硬件加速方案

  • Windows:Direct3D 9 DXVA2 /Direct3D 11 Video API/DirectShow /Media Foundation

大多数用于Windows 上的多媒体应用程序都基于Microsoft DirectShow 或Microsoft Media Foundation(MF)框架API,用他们去支持处理媒体文件的各种操作;而Microsoft DirectShow Plug in和Microsoft Foundation Transforms(MFT)均集成了Microsoft DirectX 视频加速(DXVA)2.0,允许调用标准 DXVA 2.0 接口直接操作GPU去offload Video的负载(workload)。

DirectX视频加速(DXVA)是一个API和以及需要一个对应的DDI实现,它被用作硬件加速视频处理。软件CODEC和软件视频处理器可以使用DXVA将某些CPU密集型操作卸载到GPU。例如,软件解码器可以将逆离散余弦变换(iDCT)卸载到GPU。 在DXVA中,一些解码操作由图形硬件驱动程序实现,这组功能被称为加速器( accelerator);其他解码操作由用户模式应用软件实现,称为主机解码器或软件解码器。通常情况下,加速器使用GPU来加速某些操作。无论何时加速器执行解码操作,主机解码器都必须将包含执行操作所需信息的加速器缓冲区传送给加速器缓冲区。

DXVA 2 API需要Windows Vista或更高版本。为了后向兼容,Windows Vista仍支持DXVA 1 API(Windows提供了一个仿真层,可在API和DDI的版本之间进行转换;另外,由于 DAVX 1现在存在的价值基本上是后向兼容,所以我们略过它,文章中的DXVA,大多数情况下指的实际上是 DAVA2)。为了使用 DXVA功能,基本上只能根据需要选择使用DirectShow或者Media Foundation;另外,需要注意的是,DXVA/DXVA2/DXVA-HD只定义了解码加速,后处理加速,并未定义编码加速,如果想从Windows层面加速编码的话,只能选择Media Foundation或者特定Chip厂商的编码加速实现。现在,FFmpeg只支持了DXVA2的硬件加速解码,DXVA-HD加速的后处理和基于Media Foundation硬件加速的编码并未支持(在DirectShow时代,Windows上的编码支持需要使用FSDK)。

下图展示了基于Media Foundation媒体框架下,支持硬件加速的转码情况下的Pipeline:

注意,由于微软的多媒体框架的进化,实际上,现在存在两种接口去支持硬件加速,分别是:Direct3D 9 DXVA2 与 Direct3D 11 Video API; 前者我们应该使用IDirect3DDeviceManager9 接口作为加速设备句柄, 而后者则使用ID3D11Device 接口。

对于Direct3D 9 DXVA2的接口,基本解码步骤如下:

  • Open a handle to the Direct3D 9 device.
  • Find a DXVA decoder configuration.
  • Allocate uncompressed Buffers.
  • Decode frames.

而对于Direct3D 11 Video API 接口,基本解码步骤如下:

  • Open a handle to the Direct3D 11 device.
  • Find a decoder configuration.
  • Allocate uncompressed buffers.
  • Decode frames.

在微软网站上,上述两种情况都有很好的描述,参考链接在:https://msdn.microsoft.com/en-us/library/windows/desktop/cc307941(v=vs.85).aspx。

从上面可以看到,实际上,FFmpeg基于Windows上的硬件加速,只有解码部分,且只使用了Media Foundation媒体框架,只是同时支持了两种设备绑定接口,分别是Direct3D 9 DXVA2 与 Direct3D 11 Video API。

  • Linux:VDPAU/VAAPI/V4L2 M2M

Linux上的硬件加速接口,经历了一个漫长的演化过程,期间也是各种力量的角力,下面的漫画非常形象的展示了有关接口的演化与各种力量的角力。

最终的结果是VDPAU(https://http.download.nvidia.com/XFree86/vdpau/doxygen/html/index.html)与VAAPI(https://github.com/intel/libva)共存这样一个现状,而这两个API其后的力量,则分别是支持VDPAU的Nvidia和支持VA-API的Intel,另一个熟悉的Chip厂商AMD,实际上同时提供过基于VDPAU和VA-API的支持,真是为难了他。另外,对照VDPAU与VA-API可知,VDPAU仅定义了解码部分的硬件加速,缺少了编码部分的加速(解码部分也缺乏VP8/VP9的支持,且API的更新状态似乎也比较慢),此外,值得一提的是,最新的状态是,Nvidia似乎是想用NVDEC去取代提供VDPAU接口的方式去提供Linux上的硬件加速(https://www.phoronix.com/scan.php?page=news_item&px=NVIDIA-NVDEC-GStreamer),或许不久的将来,VA-API会统一Linux上的Video硬件加速接口(这样,AMD也不必有去同时支持VDPAU 与VAAPI而双线作战的窘境),这对Linux上的用户,无疑可能是一个福音。除去VDPAU和VAAPI,Linux的Video4Linux2 API的扩展部分定义了M2M接口,通过M2M的接口,可以把CODEC作为Video Filter去实现,现在某些SoC平台下,已经有了支持,这个方案多使用在嵌入式环境之中。

下图展示了VA-API接口在X-Windows下面的框图以及解码流程:

FFmpeg 上,对VA-API的支持最为完备,基本上,所有主流的CODEC都有支持,DECODE支持的细节如下:

ENCODE支持的细节如下:

在AVFilter部分也同时支持了硬件加速的Scale/Deinterlace/ ProcAmp(color balance) Denoise/Sharpness,另外,我们在前面提及过,FFmpeg VAAPI的方案中,不只是有Intel的后端驱动,同时,它也可以支持Mesa's state-trackers for gallium drivers,这样,其实可以支持AMD的GPU。

  • macOS: VideoToolbox

在macOS上的硬件加速接口也是跟随着Apple经历了漫长的演化,从90年代初的QuickTime 1.0所使用的基于C的API开始,一直到iOS 8 以及 OS X 10.8,Apple 才最终发布完整的 Video Toolbox framework(之前的硬件加速接口并未公布,而是Apple自己内部使用),期间也出现了现在已经废弃的Video Decode Acceleration (VDA)接口。Video Toolbox是一套C API ,依赖了CoreMedia, CoreVideo, 以及 CoreFoundation 框架 ,同时支持编码,解码,Pixel转换等功能。Video Toolbox所处的基本层次以及更细节的相关结构体如下:

关于Video Toolbox的更多细节,可以参考https://developer.apple.com/documentation/videotoolbox。

参考文献

  • https://trac.ffmpeg.org/wiki/HWAccelIntro,FFmpeg的网站上对硬件加速的信息,是首要阅读的文档
  • Supporting DXVA 2.0 in Media Foundation 微软的msdn,讲解了如何在Media Foundation中支持 DXVA2, 里面讲的是如何绑定 Direct3D9 device
  • Supporting Direct3D 11 Video Decoding in Media Foundation 另一份msdn文档,讲的是Media Foundation 中如何使用 Direct3D 11 去支持 DXVA2
  • 有关标准的漫画,出自https://xkcd.com/927/
  • https://wiki.archlinux.org/index.php/Hardware_video_acceleration 和https://wiki.ubuntu.com/IntelQuickSyncVideo Archlinux和Ubuntu 网站对 VDPAU和 VA-API后端驱动的支持,虽然内容有些过时,但仍然颇值得参考
  • https://trac.ffmpeg.org/wiki/Hardware/VAAPI 和 https://wiki.libav.org/Hardware/vaapi 如果你忘了怎么在FFmpeg 命令行使用VA-API, 这两个地方是你最应该看看的
  • Video Toolbox and Hardware Acceleration 里面详细讲解了macOS平台上,硬件加速框架的演化还有Video Toobox的技术细节,与之对应的是WWDC2014 上的 https://developer.apple.com/videos/play/wwdc2014/513/ 也值得一读
  • https://github.com/intel/libva VA-API 的接口定义甚至没有正规的文档,好在头文件里面的注释还写得非常清楚,这也是典型开源项目的风格吧

活动推荐

2018年初的音视频技术生态并不平静,LiveVideoStack将通过“LiveVideoStack Meet:多媒体开发新趋势”系列沙龙,展现新技术在音视频领域的探索与实践,以及新兴应用场景和传统行业的最新、最佳实践。3月31日我们将迎来系列沙龙的第一站——北京,届时来自小米、今日头条、理光软件研究院、三体云等5位资深多媒体开发大咖一同展望多媒体开发最新趋势和技术实践。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LiveVideoStack 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FFmpeg在Intel GPU上的硬件加速与优化
大家好,今天与大家分享的主题是FFmpeg在 Intel GPU上的硬件加速与优化。
LiveVideoStack
2021/09/01
4.1K0
FFmpeg 硬件加速方案概览 (下)
MediaCodec是Google在Android API 16之后推出的用于音视频编解码的一套偏底层的API,可以直接利用硬件以加速视频的编解码处理。MediaCodec的概念中,一般而言,编解码器处理输入数据并生成输出数据。它异步处理数据并使用一组输入和输出缓冲区。在简单的层面上,需要请求(或接收)一个空输入缓冲区,填充数据并将其发送到编解码器进行处理。编解码器使用数据并将其转换为其空的输出缓冲区之一。最后,你请求(或接收)一个填充的输出缓冲区,消耗其内容并将其释放回编解码器。
LiveVideoStack
2021/09/01
1.9K0
基于FFmpeg的运动视频分析
大家好,我是来自英特尔开源技术中心的李忠,致力于对FFmpeg硬件加速的研究开发。今天我将与来自英特尔Data Center Group的张华老师一起,与大家分享我们对基于FFmpeg的运动视频分析解决方案的技术实践与探索。
LiveVideoStack
2021/09/01
1.1K0
C++ ffmpeg+dxva2实现硬解码「建议收藏」
0.前言 参考博客:ffmpeg实现dxva2硬件加速 下载源码:GitHub:https://github.com/Yacov-lu/ffmpeg-DXVA-decode
全栈程序员站长
2022/11/16
2.2K0
C++ ffmpeg+dxva2实现硬解码「建议收藏」
FFmpeg Maintainer赵军:FFmpeg关键组件与硬件加速
大家好!我是赵军,现就职于英特尔的DCG从事基于FFmpeg的硬件优化工作,两年多前加入FFmpeg社区,2018年4月成为FFmpeg的其中的一个FFmpeg Maintainer,主要负责FFmpeg的硬件优化工作。
LiveVideoStack
2021/09/01
1.4K0
Linux 系统下的硬件视频加速
在浏览器研发中,GPU 硬件加速相关的问题常常令人头疼,而这些问题中,视频播放更是棘手。回顾以往,在基于 Android 系统开发浏览器时,我曾撰写了一系列与浏览器视频播放相关的技术文章:
云水木石
2025/01/23
3200
Linux 系统下的硬件视频加速
新知 | 腾讯明眸之FFmpeg框架与媒体处理
今天的新知系列课,我们邀请到了来自腾讯明眸·极速高清团队的技术导师 —— 赵军,为大家介绍FFmpeg以及媒体处理,并与大家就FFmpeg开发、开源与云的关系等问题做一些交流。本期课程也是本次新知系列课程的最后一期,希望各位都能从这一系列的课程中有所收获!也希望大家能够继续关注我们下一系列的课程。 业界的发展趋势及特点 首先我们来看一看业界的发展。第一,多媒体业务的流量目前在互联网是一个井喷式的爆发。思科报告预计,在2020年左右,亚太地区84%的互联网流量是Video。同时我们也知道关于多媒体的业务形态
腾讯云音视频
2022/01/17
1.1K0
FFMPEG硬件编解码器使用
     在前文《视频编解码硬件方案漫谈》中我们介绍硬件视频编解码的一般方案,本文我们进一步介绍音视频编解码如何在ffmpeg使用显卡硬件进行加速。
用户4148957
2022/06/14
4K0
FFMPEG硬件编解码器使用
WebRTC 与 FFmpeg 相继发布最新版本
实时通信技术与多媒体视频处理的更新迭代无疑是音视频领域发展的强劲引擎。在此感谢腾讯云刘连响提供的新闻线索和审校! 文 / LiveVideoStack 审校 / 刘连响 据悉,WebRTC 发布了M90版本,而FFmpeg也紧随其后在4 月8日发布以“Rao”为代号的FFmpeg 4.4版本。 WebRTC M90版本发布 据了解,WebRTC M90目前可以在Chrome的测试版中使用,其中包含2个新功能和超过29个bug修复,对增强功能、稳定性与性能方面都有所改进。其中重点更新的地方在于Chr
腾讯云音视频
2021/04/29
1.5K0
赵军:与driver搏斗痛之所在亦乐之所在
LiveVideoStack:请简要介绍下自己,以及目前主要的工作方向,对哪些技术或领域感兴趣?
LiveVideoStack
2021/09/02
4580
FFmpeg从入门到精通-云享读书会
FFmpeg是一款开源软件,用于生成处理多媒体数据的各类库和程序。FFmpeg可以转码、处理视频和图片(调整视频、图片大小,去噪等)、打包、传输及播放视频。作为最受欢迎的视频和图像处理软件,它被来自各行各业的不同公司所广泛使用。
DS小龙哥
2022/10/06
5.5K0
FFmpeg从入门到精通-云享读书会
视频编解码硬件方案漫谈
       视频编解码硬件方案最早是在嵌入式领域中广泛存在,如采用DSP,FPGA,ASIC等,用来弥补嵌入式系统CPU等资源能力不足问题,但随着视频分辨率越来越高(从CIF经历720P,1080P发展到4K,8K),编码算法越来越复杂(从mpeg2经历h264,发展到h265),PC的软件规模也越来越庞大,视频应用也越来也丰富,单独靠CPU来编解码已经显得勉为其难,一种集成在显卡中gpu用来参与编解码工作已经成为主流。
用户4148957
2022/06/14
3.5K0
视频编解码硬件方案漫谈
Gstreamer中的视频处理与硬件加速
 点击上方“LiveVideoStack”关注我们 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息   //   编者按:Gstreamer作为一个比较流行的开源多媒体框架,其优秀的架构使其具有高度的模块化和良好的扩展性,并具有广泛的应用前景。LiveVideoStackCon2022上海站大会我们邀请到了英特尔 加速计算系统与图形部工程师 何俊彦老师,为我们详细介绍了Gstreamer的框架和特点,视频的模块化处理,以及其硬件加速的实现与应用案例,并总结和展望Gstreamer的发展与趋势
LiveVideoStack
2023/04/04
3.6K0
Gstreamer中的视频处理与硬件加速
【FFmpeg】在 Mac OS 中编译 FFmpeg 源码 ② ( 下载 FFmpeg 源码 | 源码编译配置 | 源码编译 | 安装库文件 | 配置环境变量 )
在上一篇博客 【FFmpeg】在 Mac OS 中编译 FFmpeg 源码 ① ( homebrew 安装 | 通过 gitee 源安装 homebrew | 安装 FFmpeg 编译所需的软件包 ) 中 , 安装了 homebrew , 并使用 homebrew 安装了 编译 FFmpeg 源码需要安装的软件包 , 本篇博客开始下载 FFmpeg 源码并进行编译 ;
韩曙亮
2024/05/24
5420
【FFmpeg】在 Mac OS 中编译 FFmpeg 源码 ② ( 下载 FFmpeg 源码 | 源码编译配置 | 源码编译 | 安装库文件 | 配置环境变量 )
英特尔QSV技术在FFmpeg中的实现与使用
本文来自英特尔资深软件工程师张华在LiveVideoStackCon 2018讲师热身分享,并由LiveVideoStack整理而成。在分享中张华介绍了英特尔GPU硬件架构,并详细解析了英特尔QS
LiveVideoStack
2021/09/01
2.6K0
腾讯云+FFmpeg打造一条完备高效的视频产品链
大家好,我是腾讯云的赵军,同时我也是FFmpeg决策委员会委员、开源爱好者。在2018年成为FFmpeg maintainer,2019年入选 FFmpeg 决策委员会(voting committee),具备丰富的基于Linux 的Router/Gateway 开发经验,并持续关注Linux 在网络方面发展。曾开发基于Linux 的高清/ 标清H.264/MPEG2视频解码器及图像处理平台。曾在Intel DCG/NPG 负责基于FFmpeg以及Intel平台上的视频编码/解码/转码、视频后处理、视频分析的硬件加速的工作。目前在腾讯云负责视频云的系统优化相关工作,除去支持公司内部的项目开发以外,也在持续向FFmpeg社区提交patch,同时也倡导引领同事以开放的心态拥抱开源。
LiveVideoStack
2019/09/25
2.4K0
腾讯云+FFmpeg打造一条完备高效的视频产品链
2023-04-18:ffmpeg中的hw_decode.c的功能是通过使用显卡硬件加速器(如 NVIDIA CUDA、Inte
2023-04-18:ffmpeg中的hw_decode.c的功能是通过使用显卡硬件加速器(如 NVIDIA CUDA、Intel Quick Sync Video 等)对视频进行解码,从而提高解码效率和性能。在进行硬件加速解码时,相较于 CPU 的软件解码方式,GPU 可以利用其并行处理能力和更高的带宽进行更高效的解码操作。请用go语言改写hw_decode.c文件。
福大大架构师每日一题
2023/06/09
8060
2023-04-18:ffmpeg中的hw_decode.c的功能是通过使用显卡硬件加速器(如 NVIDIA CUDA、Inte
不动源码,让FFmpeg命令行执行时间缩短400%
FFmpeg是一个很好的多媒体处理工具,默认情况下,它使用多线程的CPU来完成任务,这给你的电脑带来了很高的负荷,在大多数时候是很慢的。
智影Yodonicc
2022/04/26
10.9K2
不动源码,让FFmpeg命令行执行时间缩短400%
SkeyeRTSPLive高效转码之SkeyeVideoDecoder采用Intel集成显卡高效硬件解码解决方案(附源码) (1)
在我之前写的一篇文章《SkeyeRTSPLive传统视频监控互联网+实现利器解决方案》中提到RTSP转RTMP的转流过程,简化流程就是通过SkeyeRTSPClient拉RTSP流,获取音视频编码数据,然后再通过SkeyeRTMPPusher推出去,流程非常简单;然后再实际开发过程中,我们发现其实这个过程并没有想象中那么简单;首先,RTSP协议支持多种音视频编码格式,如音频支持AAC,G711,G726,等,视频支持H264,H625,MJPEG, MPEG等等各种格式,而SkeyeRTMP推流只支持H264(已扩展支持H265)格式,这时,音频我们可以通过SkeyeAACEncoder将音频转码成AAC格式,而视频我们可以通过SkeyeVideoDecoder解码成原始数据,然后再通过SkeyeVideoEncoder将原始数据转码成RTMP推送指定的格式,本文,我们将重点讲述SkeyeVideoDecoder基于Intel硬解码库的硬解码流程。
Openskeye
2023/04/23
3250
【说站】PotPlayer 播放器v1.7.21759绿色版
PotPlayer,免费全能影音播放器,堪称Windows平台最强本地视频播放器。PotPlayer播放器,拥有强劲播放引擎加速,支持DXVA, CUDA, QuickSync,多媒体播放器支持蓝光3D,内置强大的解码器及滤镜/分离器,支持自定义添加解码器,对字幕的支持非常优秀,能够兼容特效字幕及在线搜索字幕实时翻译。
很酷的站长
2022/11/25
2K13
【说站】PotPlayer 播放器v1.7.21759绿色版
推荐阅读
相关推荐
FFmpeg在Intel GPU上的硬件加速与优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档