【ffmpeg+cuda实现硬编解码】

这篇具有很好参考价值的文章主要介绍了【ffmpeg+cuda实现硬编解码】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近在搞一个项目,我需要向AI提供视频帧数,本来一开始摄像头是H.264的编码,我直接复制流推到AI层去推理,然后需要将事件回溯成30秒的视频截取。结果摄像头换成了HEVC编码,截取的视频不能在网页直接播放(需要JS实现调用硬解码)。一开始的方案是ffmpeg直接将HEVC转成H.264结果因为事务巨多CPU占用量过大,导致影响到了推理,因为本身选用的模型+杂七杂八的业务逻辑也要占用大量的CPU资源,所以经过研究把ffmpeg和nvcodec结合起来来平衡设备性能,算是解决了这个问题吧。


一、先安装CUDA+NVCODEC

这两个是前提条件,我在之前的文章里已经说明了具体步骤,有需要的请移步文章。
opencv+nvcodec实现视频硬解码

二、编译带NVCODEC的FFMPEG

这里使用的ffmpeg版本是4.4.2,之前也有尝试过编译5.0.1,本身没有什么错误,但是和我的opencv-4.5.1合并编译遇到了很多错误,可能是这个版本太新的缘故,所以就选择了4.4.2这个版本,实测没有任何问题,至少可以满足我的需求了。

1、安装环境

  1. 安装必要软件包
sudo apt install autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-dev
  1. 安装汇编编译器
sudo apt install nasm yasm

3.安装扩展
这里我只用到了libx264和libx265,如果你有其它的需求就自行安装即可,这些软件基本上在Ubuntu的库里都能找到,不能找到的也可以通过源代码编译安装。

注意: 必须在ffmpeg编译前就把需要的软件安装,否则勾选了这些选项会报错

sudo apt install libx264-dev libx265-dev

4.安装依赖头文件包

这里需要安装一个头文件包,里面包含了一系列用到的头文件。

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
sudo make install

2、开始编译

可以从官网或者github下载4.4.2的源代码,这里我只演示4.4.2版本,如果你的环境和我一样,绝对可以保证完美运行,其他版本请自行测试。
FFMPEG官网

tar -xmf ffmpeg-4.4.2.tar.xz
cd ffmpeg-4.4.2/
./configure --prefix=/usr --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --disable-stripping --enable-avresample --enable-shared --enable-libx264 --enable-libx265 --enable-cuda --enable-cuvid --enable-nvenc  --enable-gpl
make -j$(nproc)
sudo make install

3、验证

ffmpeg -encoders

【ffmpeg+cuda实现硬编解码】
只要有红框里面的说明ffmpeg编译没有问题,具体功能还要进一步验证,找一个hevc格式或h264的视频执行下面的命令

HEVC->H.264

ffmpeg -vcodec hevc_cuvid -an -gpu 0 -i <vidoe_path> -vcodec h264_nvenc -an -gpu 0 -y output.mp4

H.264->HEVC

ffmpeg -vcodec h264_cuvid -an -gpu 0 -i <video_path> -vcodec hevc_nvenc -an -gpu 0 -y output.mp4

参数说明:
-i 视频路径,可以是绝对,可以是相对
-vcodec 视频解码器或编码器,写在-i前面的是解码,写在后面的是编码
-an 这里由于测试视频,所以禁用了音频,需要音频的可以不加这个选项
-gpu 指定哪个显卡来完成操作,只有一张显卡的可以不指定,默认显卡是从0开始的,指定了不存在的显卡会报错
-y 直接确认覆盖output.mp4假如存在的话

我用到的就这些,其他还有很多如比特率,帧率,质量等等请自行摸索,毕竟学无止境。到这里就算是讲完了,如果想看显卡的占用率的话输入以下命令

nvidia-smi dmon

【ffmpeg+cuda实现硬编解码】

参数就不详细解读了,简单介绍下:

Idx就是显卡索引,0是第一块,1是第二块,依次类推;pwr是功率,单位瓦特
gtemp是核心温度,工作起来会增长,太高了会降频或者触发保护
mtemp应该是显存温度,这里一直是0,不知道啥原因
sm是流处理器占用率
enc是编码器占用率
dec是解码器占用率
mclk是显存时钟,动态调整的,待机很低,工作会自行增长
pclk是核心频率,就是流处理器的频率,也是动态调整的

这里多说一句:

1、编解码本身肯定是占用显存的,这一点是没有疑问的。所以老黄说的完全独立的硬件这里是不完全对的。这句话应该是相对于cuda软解码说的,cuda本身也是可以硬算的,从某种角度来说,cuda也属于通用处理器了,而nvcodec才是专用编解码处理器

2、从占用上来看,硬件编解码应该是消耗一定的cuda性能的,这一部分可能主要是显存拷贝数据的消耗,这个目前只是我的猜测,现在还拿不出证据,具体可以通过测试AI能力是否下降来确定,就推理来说,显存一般都是够用的。


总结

不要让GPU的解码单元闲着,毕竟花钱了,也能分摊一部分CPU压力。而且有些模型可以直接将硬解码的数据送到推理里面去而不用从显存转到内存,省略了这样一个消耗。文章来源地址https://www.toymoban.com/news/detail-497751.html

到了这里,关于【ffmpeg+cuda实现硬编解码】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3588芯片支持8K视频的硬编解码

    RK3588是一款采用8nm制程工艺的高端通用型SoC,CPU采用四核A76和四核A55的八核架构,GPU采用Mail G610MP4,集成6TOPS独立NPU,支持四通道LPDDR5,有效保证了RK3588芯片的性能输出。RK3588在视频编解码方面也十分突出,支持8K视频的硬编硬解,非常适合VR(虚拟现实)、AR(增强现实)、

    2024年02月12日
    浏览(36)
  • ffmpeg实现视频解码

    参考100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x) 平台环境:windows VS 2022 以及在 项目-项目属性-链接器-命令行,在右侧其他选项中添加“/SAFESEH:NO”,这样就不会再报错了。 1.初始化FFmpeg库: 在代码中引入相关的FFmpeg头文件,并调用初始化函数。例如: 2.打开输

    2024年01月24日
    浏览(26)
  • FFmpeg 开发(14):Android FFmpeg + MediaCodec 实现视频硬解码

    FFmpeg 开发系列连载: FFmpeg 开发(01):FFmpeg 编译和集成 FFmpeg 开发(02):FFmpeg + ANativeWindow 实现视频解码播放 FFmpeg 开发(03):FFmpeg + OpenSLES 实现音频解码播放 FFmpeg 开发(04):FFmpeg + OpenGLES 实现音频可视化播放 FFmpeg 开发(05):FFmpeg + OpenGLES 实现视频解码播放和视频滤镜 FFmpeg 开发

    2024年02月09日
    浏览(25)
  • ffmpeg+intel核显实现硬解码

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 之前写了一篇关于ffmpeg+nvcuvid实现硬解码的文章,最近得到一个只有intel集显的笔记本电脑,cpu是比较垃圾的5200U,核显是HD5500,也是个有年头的老爷机了吧。 因为intel解码没有nvidia那么热门,以目前只研

    2024年02月13日
    浏览(43)
  • FFMpeg 实现视频解码、编码、转码流程详解

    打开FFmpeg源码,会发现有一系列libavxxx的模块,这些模块很好地划分了代码的结构和分工。 libavformat,format,格式封装 libavcodec,codec,编码、解码 libavutil,util,通用音视频工具,像素、IO、时间等工具 libavfilter,filter,过滤器,可以用作音视频特效处理 libavdevice,device,设备

    2024年02月11日
    浏览(29)
  • golang基于FFmpeg实现视频H264编解码

    FFmpeg 是领先的多媒体框架,能够解码、编码、转码、混合、解密、流媒体、过滤和播放人类和机器创造的几乎所有东西。它支持最晦涩的古老格式,直到最尖端的格式。无论它们是由某个标准委员会、社区还是公司设计的。它还具有高度的便携性。 FFmpeg 可以在 Linux、Mac OS

    2024年02月11日
    浏览(35)
  • 【FFmpeg在Intel GPU上的硬件编解码实现】

    以下文章是在开发过程中参考的比较有意义的文章,供大家学习和参考~~ https://zhuanlan.zhihu.com/p/62246545 ##FFMPEG+Intel QSV硬解的环境安装篇## https://zhuanlan.zhihu.com/p/372361709 ##Ubuntu20.04 ffmpeg添加 Intel核显QSV加速支持## https://blog.csdn.net/weixin_47407737/article/details/128933104 ##FFmpeg集成qsv的编译

    2024年02月15日
    浏览(29)
  • 基于FFMpeg实现音频mp3/aac/wav解码

    编译环境:Ubuntu16.04 64位 交叉编译工具:arm-himix200-linux-gcc 我这里使用的是ffmpeg-5.1.2.tar.gz,下载地址点击下载地址。 这样,/root/ffmpeg-5.1.2/output下面就是咱们要的程序,bin目录下ffmpeg可以在开发板上运行,include下是需要的头文件,lib下是需要的静态库,share/ffmpeg/examples是一些

    2024年02月11日
    浏览(39)
  • ExoPlayer(AndroidX Media3) 扩展ffmpeg实现音频软解码

    1.Ubuntu 20.04.4 LTS 2.AndroidNDK版本r26C 3.AndroidStudio 2023.1.1(配置好SDK和JDK 17.0.10) 4.ffmpeg6.0源码 5.ExoPlayer源码,AndroidX Media release分支版本 目前官方已废弃Exopler2,代码已经迁移到AndroidX Media,下载完成设置FFMPEG_MODULE_PATH变量 1. git clone https://github.com/androidx/media 2. cd media FFMPEG_MODULE_PATH

    2024年04月12日
    浏览(88)
  • FFmpeg编解码流程解读--视频解码1

    首先我们知道ffmpeg是一个开源的音视频编解码,封装和解封装的工具。具体的下载方式这里不多赘述(感兴趣百度自行下载源码)。这里主要将编解码。ffmpeg音视频编解码依赖libavcodec。其为我们提供一套架构,其中包含了编解码器。这里主要介绍我们常用的一些API接口去处理

    2023年04月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包