FFmpeg之AVHWAccel

这也是ffmpeg解码器中比较重要的一个模块,很多人认识它应该是通过一条命令

ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:v h264_nvenc -b:v 5M output.mp4

命令地址:英伟达ffmpeg

大家可能觉得这就是nvcodec了,后来发现专门还有一个cuvid呢?瞬间不开心了,不知道这两个倒地时什么关系?如果你时看这个问题的,恭喜你来对了。
下面我们就说道说道。
ffmpeg是通过解码起家,所以它内部有很多自己写的软解码器,在这些软解码器的解码过程当中,比如说对于码流中的某些反量化,反变换等操作,把这些操作挪到一块硬件上,这块硬件就是加速设备。
我们可以看看ffmpeg的h264解码器,红框内部的都是h264解码器的加速插件,NVDEC只是其中之一。
在这里插入图片描述
再来看看代码


static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
{AVCodecContext *const avctx = h->avctx;...switch (nal->type) {case H264_NAL_IDR_SLICE:...if (h->avctx->hwaccel &&//这里就进入了加速解码的分支(ret = h->avctx->hwaccel->start_frame(h->avctx, buf, buf_size)) < 0)goto end;}...max_slice_ctx = avctx->hwaccel ? 1 : h->nb_slice_ctx;if (h->nb_slice_ctx_queued == max_slice_ctx) {//这里进入加速解码的分支中if (h->avctx->hwaccel) {ret = avctx->hwaccel->decode_slice(avctx, nal->raw_data, nal->raw_size);h->nb_slice_ctx_queued = 0;} elseret = ff_h264_execute_decode_slices(h);if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))goto end;}break;...

这就是hwaccel加速解码的原理,它是在ffmpeg软解码的基础上将一些特定算法加载到硬件上去做。而cuvid是通过ffmpeg第三方插件库的方式去实现的。

可以看看AVHWAccel结构体定义,发现有几个关键的函数指针,这些指针就是你需要去实现的。
可能你又要问了,为什么英伟达解码器要实现两套?
这个问题留给你吧。或者在我博客里面找,一定有的。


/*** @defgroup lavc_hwaccel AVHWAccel** @note  Nothing in this structure should be accessed by the user.  At some*        point in future it will not be externally visible at all.** @{*/
typedef struct AVHWAccel {/*** Name of the hardware accelerated codec.* The name is globally unique among encoders and among decoders (but an* encoder and a decoder can share the same name).*/const char *name;/*** Type of codec implemented by the hardware accelerator.** See AVMEDIA_TYPE_xxx*/enum AVMediaType type;/*** Codec implemented by the hardware accelerator.** See AV_CODEC_ID_xxx*/enum AVCodecID id;/*** Supported pixel format.** Only hardware accelerated formats are supported here.*/enum AVPixelFormat pix_fmt;/*** Hardware accelerated codec capabilities.* see AV_HWACCEL_CODEC_CAP_**/int capabilities;/****************************************************************** No fields below this line are part of the public API. They* may not be used outside of libavcodec and can be changed and* removed at will.* New public fields should be added right above.******************************************************************//*** Allocate a custom buffer*/int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame);/*** Called at the beginning of each frame or field picture.** Meaningful frame information (codec specific) is guaranteed to* be parsed at this point. This function is mandatory.** Note that buf can be NULL along with buf_size set to 0.* Otherwise, this means the whole frame is available at this point.** @param avctx the codec context* @param buf the frame data buffer base* @param buf_size the size of the frame in bytes* @return zero if successful, a negative value otherwise*/int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);/*** Callback for parameter data (SPS/PPS/VPS etc).** Useful for hardware decoders which keep persistent state about the* video parameters, and need to receive any changes to update that state.** @param avctx the codec context* @param type the nal unit type* @param buf the nal unit data buffer* @param buf_size the size of the nal unit in bytes* @return zero if successful, a negative value otherwise*/int (*decode_params)(AVCodecContext *avctx, int type, const uint8_t *buf, uint32_t buf_size);/*** Callback for each slice.** Meaningful slice information (codec specific) is guaranteed to* be parsed at this point. This function is mandatory.* The only exception is XvMC, that works on MB level.** @param avctx the codec context* @param buf the slice data buffer base* @param buf_size the size of the slice in bytes* @return zero if successful, a negative value otherwise*/int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);/*** Called at the end of each frame or field picture.** The whole picture is parsed at this point and can now be sent* to the hardware accelerator. This function is mandatory.** @param avctx the codec context* @return zero if successful, a negative value otherwise*/int (*end_frame)(AVCodecContext *avctx);/*** Size of per-frame hardware accelerator private data.** Private data is allocated with av_mallocz() before* AVCodecContext.get_buffer() and deallocated after* AVCodecContext.release_buffer().*/int frame_priv_data_size;/*** Called for every Macroblock in a slice.** XvMC uses it to replace the ff_mpv_reconstruct_mb().* Instead of decoding to raw picture, MB parameters are* stored in an array provided by the video driver.** @param s the mpeg context*/void (*decode_mb)(struct MpegEncContext *s);/*** Initialize the hwaccel private data.** This will be called from ff_get_format(), after hwaccel and* hwaccel_context are set and the hwaccel private data in AVCodecInternal* is allocated.*/int (*init)(AVCodecContext *avctx);/*** Uninitialize the hwaccel private data.** This will be called from get_format() or avcodec_close(), after hwaccel* and hwaccel_context are already uninitialized.*/int (*uninit)(AVCodecContext *avctx);/*** Size of the private data to allocate in* AVCodecInternal.hwaccel_priv_data.*/int priv_data_size;/*** Internal hwaccel capabilities.*/int caps_internal;/*** Fill the given hw_frames context with current codec parameters. Called* from get_format. Refer to avcodec_get_hw_frames_parameters() for* details.** This CAN be called before AVHWAccel.init is called, and you must assume* that avctx->hwaccel_priv_data is invalid.*/int (*frame_params)(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx);
} AVHWAccel;

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

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

相关文章

PS不按比例裁剪图片

点击左侧的裁剪工具后&#xff0c;然后点击底部工具栏中的清除选项。

【docker】容器使用(Nginx 示例)

查看 Docker 客户端命令选项 docker上面这三张图都是 常用命令&#xff1a; run 从映像创建并运行新容器exec 在运行的容器中执行命令ps 列出容器build 从Dockerfile构建映像pull 从注册表下载图像push 将图像上载到注册表…

【51单片机】俄罗斯方块游戏-LED点阵

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用51单片机控制器&#xff0c;使88LED点阵&#xff0c;按键等。 主要功能&#xff1a; 系统运行后&#xff0c;88LED点阵显示游戏界面&#xff0c;K1和K2键控制左右移动&#xff0c;K3和K4键控制…

【产品经理】产品的实现,需要做好战略规划

产品的实现需要做好产品规划&#xff0c;而产品的规划决定了产品的方向。本文从战略规划的重要性、产品定位、设计产品架构图三个方向&#xff0c;详细地为大家梳理了产品实现的前期准备。 我们知晓了如何去发掘问题&#xff0c;并找到解决方案。 可对于问题的处理&#xff0c…

Qt Desktop Widgets 控件绘图原理逐步分析拆解

Qt 是目前C语言首选的框架库。之所以称为框架库而不单单是GUI库&#xff0c;是因为Qt提供了远远超过GUI的功能封装&#xff0c;即使不使用GUI的后台服务&#xff0c;也可以用Qt大大提高跨平台的能力。 仅就界面来说&#xff0c;Qt 保持各个平台绘图等效果的统一&#xff0c;并…

diffusers pipeline拆解:理解pipelines、models和schedulers

diffusers pipeline拆解&#xff1a;理解pipelines、models和schedulers 翻译自&#xff1a;https://huggingface.co/docs/diffusers/using-diffusers/write_own_pipeline v0.24.0 diffusers 设计初衷就是作为一个简单且易用的工具包&#xff0c;来帮助你在自己的使用场景中构建…

ftp传海量文件会卡?跨境数据传输推荐使用FTP吗?

企业在传输大量文件时&#xff0c;经常会遇到FTP卡顿的问题&#xff0c;尽管采取多种方式仍无法完美解决&#xff0c;尤其是在跨境数据传输方面。对于紧急项目而言&#xff0c;文件数据无法及时同步可能导致任务无法按时完成。在传输速度方面&#xff0c;甚至可能出现每秒几KB的…

Jmeter入门

一、下载jmeter 官网下载 下载之后解压&#xff0c;在目录/bin下面找到jmeter.bat双击之后即可启动Jmeter。 二、使用 如下左图&#xff0c;选择语言为中文&#xff0c;可以修改测试计划的名称。如下右图&#xff0c;添加线程组 添加线程组 添加http请求 路径传参方式 …

Morphisec革命:利用移动目标防御增强Windows安全性

来源&#xff1a;艾特保IT 虹科分享 | Morphisec革命&#xff1a;利用移动目标防御增强Windows安全性 原文链接&#xff1a;虹科分享 | Morphisec革命&#xff1a;利用移动目标防御增强Windows安全性 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; Windows 10安全工…

js中分号产生的问题详解,第一次出现分号导致的问题的记录

图示: 现在 这段代码本来是两行,但是格式化后注意下面一行缩进了,代表按一行解析了, 结果: 加上分号后再格式化就自动对齐了,代表按两行解析. 要是按照没有分号进行解析是怎样的? GPT回答: 这段代码是一行 JavaScript 代码&#xff0c;涉及到了 JSON 对象、条件语句和跳转页面…

深入理解RBAC权限系统

最近&#xff0c;一位朋友在面试中被问及如何设计一个权限系统。我们注意到目前许多后台管理系统&#xff08;包括一些热门的如若依快速开发平台&#xff09;都采用了RBAC访问控制策略。该策略通过将权限授予角色&#xff0c;然后将角色分配给用户&#xff0c;从而实现对系统资…

推荐一个FL Studio最适配的midi键盘?

Hello大家好&#xff01;好消息&#xff01;好消息&#xff01;特大好消息&#xff01; 水果党们&#xff01;终于有属于自己的专用MIDI键盘啦&#xff01; 万众期待的Novation FLKEY系列 正式出炉&#xff01; 做编曲和音乐制作的朋友们&#xff0c;对水果软件FLSTUDIO应该…

mysql开启查询日志

mysql默认不开启查询日志&#xff0c;可以通过命令查询 show VARIABLES LIKE general%; 开启查询日志&#xff0c;并更改日志存放目录&#xff0c;不过存放的目录一定要有权限不然会报错 手动创建一下log目录下的mysql目录并赋予权限 mkdir /var/log/mysql chown -R mysql:m…

在vue3的js中将一组数据赋值的问题

代码: if (res.data) { myPrizeList.value res.data console.log(myPrizeList.value,myPrizeList.value) const giftList ref() console.log(JSON.parse(JSON.stringify(myPrizeList.val…

【计算机网络】URL概念及组成

目录 一、什么是URL 二、URL格式 示例&#xff1a; 1. Scheme&#xff08;协议&#xff09;&#xff1a; 2. Host&#xff08;主机&#xff09;&#xff1a; 3. Port&#xff08;端口&#xff09;&#xff1a; 4. Path&#xff08;路径&#xff09;&#xff1a; 5. Quer…

二叉树--基础OJ

1.对称二叉树 题目链接&#xff1a;101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 我们可以用递归的方法去做&#xff1a; 如果两个树互为镜像&#xff08;1.根节点的值相同&#xff0c;2.左子树的值与右子树的值对称&#xff09;则为对称二叉树&a…

Vue--第八天

Vue3 1.优点&#xff1a; 2.创建&#xff1a; 3.文件&#xff1a; 换运行插件&#xff1a; 4.运行&#xff1a; setup函数&#xff1a; setup函数中获取不到this&#xff08;this 在定义的时候是Undefined) reactive()和ref(): 代码&#xff1a; <script setup> // …

数字孪生技术的应用场景

数字孪生技术具有广泛的应用场景&#xff0c;涉及多个行业和领域。以下是一些数字孪生的常见应用场景&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.制造业优化&#xff1a; 数字孪生可用于建模和…

易基因:MeRIP-seq等揭示m6A RNA甲基化以ABA依赖性方式调控草莓果实成熟 | 作物育种

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 DNA甲基化等表观遗传标记在调控不同成熟阶段果实成熟中起着关键作用。m6A甲基化已被证明可以调控番茄成熟&#xff0c;但目前尚不清楚 mRNA m6A甲基化是否对不同类型水果的成熟调控具有功…

快速入门Tailwind CSS:从零开始构建现代化界面

快速入门Tailwind CSS&#xff1a;从零开始构建现代化界面 介绍 Tailwind CSS 是一个以原子类的方式快速构建界面的 CSS 框架。它提供了丰富的预定义类&#xff0c;使得开发者能够快速构建样式和布局。 安装和设置 首先&#xff0c;我们需要在项目中安装 Tailwind CSS。可以…