文章目录

  • ffmpeg支持硬件加速的原理
  • 所用环境说明
  • ffmpeg使用硬件加速
    • 安装nvidia驱动
    • 安装cuda
    • 加入header
    • 安装pkgconfig
    • 开始配置
  • 在ffmpeg中看如何使用硬件加速
    • 查看目前可以用的hwaccel选项
    • 普通的解码命令
    • 仅仅是转码,不做缩放
    • 转码,外带一个缩放
  • 题外话,如何使用scale_npp
  • 简单分析一下ffmpeg源码中的硬件加速部分
  • 参考网站

ffmpeg支持硬件加速的原理

ffmpeg的硬件加速原理大概就是采用硬件对编解码进行处理,硬件有转码进行解码的sdk,比如nvidia的sdk等

所用环境说明

  • ffmpeg版本:4.2.2
  • cuda版本:10.2
  • nvidia驱动版本:470.57.02

先放一个结论:GPU的解码肯定是要比CPU快的,但前提是两个都是差不对水平的硬件,而且GPU的成本相对CPU来说要低很多;比如我的测试机,一个GTX970M的显卡,基本跟一个7700k的i7差不多(甚至更好)了;

ffmpeg使用硬件加速

安装nvidia驱动

从官网下载NVIDIA-Linux-x86_64-470.57.02.run,直接安装

安装cuda

下载cuda_10.2.89_440.33.01_linux.run也是直接安装
安装完成后修改profile,将cuda中的bin目录写到path中

sudo vi /etc/profile
export PATH=/usr/local/cuda/bin:$PATH

让配置生效

source /etc/profile

验证是否找到了nvcc

nvcc --version(或者nvcc -V)

输出如下内容

加入header

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

安装pkgconfig

sudo apt-get install pkgconfig

开始配置

由于使用到了硬件加速,那么在配置configure中也需要将其加入进来

./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-nonfree --enable-pthreads --extra-cflags=-g --extra-cflags=-O0 --extra-libs=-lstdc++ --extra-cxxflags=-g --extra-cxxflags=-O0 --extra-cxxflags=-fpermissive --enable-debug=3 --disable-optimizations --disable-stripping --disable-x86asm --enable-cuda-nvcc --enable-cuvid --enable-shared --enable-nvenc --enable-shared

接着执行make,产生ffmpeg可执行文件

在ffmpeg中看如何使用硬件加速

假设在ffmpeg工程文件夹下有有个1.mp4的文件

查看目前可以用的hwaccel选项

./ffmpeg -hwaccels

出现如下内容

普通的解码命令

cpu解码
./ffmpeg -i aa.mp4 output2.yuv -y

gpu解码

./ffmpeg -c:v h264_cuvid -i aa.mp4 -c:v h264_nvenc output.yuv -y

仅仅是转码,不做缩放

./ffmpeg -c:v h264_cuvid -i a.mp4 -c:a copy -vf "format=yuv420p,hwupload_cuda" -c:v h264_nvenc 2.mp4 -y

转码,外带一个缩放

cpu操作命令

./ffmpeg -i a.mp4 -vf scale=1280:720 2.mp4 -y

gpu操作命令

./ffmpeg -c:v h264_cuvid -i a.mp4 -c:a copy -vf "format=yuv420p,hwupload_cuda,scale_cuda=1280:720" -c:v h264_nvenc -b:v 5M 2.mp4 -y

题外话,如何使用scale_npp

配置configure中需要将其加进来

./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-nonfree --enable-pthreads --extra-cflags=-g --extra-cflags=-O0 --extra-libs=-lstdc++ --extra-cxxflags=-g --extra-cxxflags=-O0 --extra-cxxflags=-fpermissive --enable-debug=3 --disable-optimizations --disable-stripping --disable-x86asm --enable-cuda-nvcc --enable-cuvid --enable-shared --enable-nvenc --enable-shared --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64

make后得到的ffmpeg,启动这个快速的缩放命令

./ffmpeg -hwaccel cuvid -c:v h264_cuvid -i aa.mp4 -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y 2.mp4

在ffmpeg4.2.2上编译后使用上面的命令会报错,提示找不到npp这个滤镜;重新到GitHub拉去4.4后,重新configure、make后执行通过,测试如下

同一个视频平均才18.7X,GPU使用率最大不到15%;比使用scale_cuda来做缩放要慢一点,以下是同一个视频采用scale_cuda来缩放的速度

测试的命令分别如下

./ffmpeg -c:v h264_cuvid -i aa.mp4 -c:a copy -vf "format=yuv420p,hwupload_cuda,scale_cuda=1280:720" -c:v h264_nvenc -b:v 2048k 2.mp4 -y
./ffmpeg -hwaccel cuvid -c:v h264_cuvid -i aa.mp4 -c:a copy -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:720 2.mp4 -y

简单分析一下ffmpeg源码中的硬件加速部分

在cuviddec.c中的cuvid_decode_packet函数,其中的一行代码是这样的
ret = CHECK_CU(ctx->cvdl->cuvidParseVideoData(ctx->cuparser, &cupkt));

这个函数在dynlink_nvcuvid.h中有对应的声明

/************************************************************************************************/
//! \ingroup FUNCTS
//! \fn CUresult CUDAAPI cuvidParseVideoData(CUvideoparser obj, CUVIDSOURCEDATAPACKET *pPacket)
//! Parse the video data from source data packet in pPacket
//! Extracts parameter sets like SPS, PPS, bitstream etc. from pPacket and
//! calls back pfnDecodePicture with CUVIDPICPARAMS data for kicking of HW decoding
//! calls back pfnSequenceCallback with CUVIDEOFORMAT data for initial sequence header or when
//! the decoder encounters a video format change
//! calls back pfnDisplayPicture with CUVIDPARSERDISPINFO data to display a video frame
/************************************************************************************************/
typedef CUresult CUDAAPI tcuvidParseVideoData(CUvideoparser obj, CUVIDSOURCEDATAPACKET *pPacket);

整个流程详细的内容差不多都在cuviddec.c中的cuvid_output_frame函数中

参考网站

  • ffmpeg安装ERROR: cuvid requested
  • FFmpeg-Nvidia硬解码
  • ffmpeg4.3 安装 in Ubuntu18.04
  • NVIDIA FFmpeg 转码指南
  • NVIDIA FFmpeg Transcoding Guide
  • USING FFMPEG WITH NVIDIA
    GPU HARDWARE
    ACCELERATION
  • ffmpeg命令行使用nvidia CUDA scaling高速转分辨率转码(libnpp)
  • 视频和视频帧:Intel GPU(核显)的编解码故事
  • ffmpeg解码的软解及硬解(cuda和qsv)使用方法
  • ffmpeg 采用cuda 硬编解码
  • CUDA和FFMPEG硬件解码视频流

ffmpeg使用硬件加速hwaccel、cuvid、h264_cuvid、h264_nvenc相关推荐

  1. FFMPEG NVIDIA硬件加速总结

    目录 1.NVDIA概述 2.FFmpeg集成到GPU 3.FFmpeg uses Video Codec SDK 4.ffmpeg对NVIDIA GPU的编译步骤 4.1configure命令 4. ...

  2. ffmpeg Nvidia硬件加速总结

    0. 概述 FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用.Video Codec SDK包含完整的的高性能工具.源码及文档,支 ...

  3. ffmpeg Intel硬件加速总结

    0. 概述 FFmpeg可通过Intel的GPU进行加速,加速器的名称是Intel Quick Sync Video,简称qsv,支持该加速器的Intel处理器的型号是带有Intel Iris gra ...

  4. FFmpeg视频解码硬件加速

    <音视频应用开发系列文章目录> ffmpeg支持的硬件解码器 enum AVHWDeviceType {AV_HWDEVICE_TYPE_NONE,AV_HWDEVICE_TYPE_VDP ...

  5. ffmpeg gpu硬件加速

    整理下自己百度以及实验成功的结果 0. 成功截图. 一开始, 我用cpu去跑, 速度大约在 3-5 s 这样子. 用gpu去跑,速度就到15-20 这个样子. 确实快了很多. 1. 环境安装及检查. ...

  6. 使用GPU硬件加速FFmpeg视频转码

    最近看了些视频处理相关的文章,这里有一篇是讲如何使用Nvidia显卡为视频的编解码进行加速的, 为了方便查阅就转载了: 本文内容包括: 在Linux环境下安装FFmpeg 通过命令行实现视频格式识别和 ...

  7. FFmpeg再学习 -- 硬件加速编解码

    为了搞硬件加速编解码,用了一周时间来看 CUDA,接下来开始加以总结. 一.什么是 CUDA (1)首先需要了解一下,什么是 CUDA. 参看:百度百科 -- CUDA 参看:CUDA基础介绍 参看: ...

  8. ffmpeg 硬件加速视频转码指南

    0. 系统环境 基于 Windows 下演示,Linux 下也可以适用. 所使用 ffmpeg 版本为 BtbN 编译的 win64-gpl 版(非 gpl-share),项目地址:BtbN / FF ...

  9. FFmpeg 硬件加速方案概览 (下)

    被称为"多媒体技术领域的瑞士军刀",FFmpeg拥有广泛的应用基础.不过,当(实时)处理海量视频时,需要借助各种方法提升效率.比如,短视频平台Revvel将视频转码服务迁移到AWS ...

最新文章

  1. 销量过亿的《剑指0ffer》题目和答案电子书 (附下载)
  2. linux sed 小数点,每天进步一点点——linux——sed
  3. R语言使用hexSticker包将ggplot2包可视化的结果转换为六角图(六角贴、六角形贴纸、ggplot2 plot to hex sticker)、并自定义设置文本的内容、文本对应的字体
  4. php cgi漏洞,CGI漏洞攻击合集上
  5. 强大的,方便编程的vim配置
  6. 两个html页面之间通讯,面试官:前端跨页面通信,你知道哪些方法?
  7. 织梦响应式教育机构官网网站模板
  8. js数组查找最接近_如何从javascript中的对象数组中获取最接近的先前id
  9. Codeforces Gym 100463A Crossings 逆序数
  10. 输入班级人数,根据人数,挨个输入成绩,求平均分,求最高分最低分
  11. 【李宏毅2020 ML/DL】P78 Generative Adversarial Network | fGAN: General Framework of GAN
  12. 使用Scikit-Learn,XGBoost,LightGBM和CatBoost进行梯度增强
  13. 台达人机界面编程小技巧之合理使用偏移地址
  14. pano2vr无法输出html5,教大家Pano2VR怎么输出全景图的方法
  15. 计算机毕业设计ssm线上学习系统8e88w系统+程序+源码+lw+远程部署
  16. CTFshow——萌新记忆
  17. 比尔·盖茨买百万亩农地成美“头号地主”,图扑数字孪生农场
  18. 案例复盘:从上海首例遗弃犬只案看 如何精准研判舆情争议点
  19. 三星在美三大报投整版道歉信 中美待遇为何迥然不同
  20. js如何判断保留两位小数

热门文章

  1. 在docker容器中操作es,并给es7.6添加用户鉴权设置密码
  2. Ubuntu18 网速显示 插件 显示在状态栏
  3. 海康威视综合安防平台视频摄像头接入Java
  4. 虚拟机一插U盘或读卡器就死机的解决办法
  5. A systems-biology model of the tumor necrosis factor (TNF) interactions with TNF receptor 1 and 2
  6. Niubility (分享一) Flink 在快手实时多维分析场景的应用
  7. win7计算机里没有桌面快捷方式,Win7桌面快捷方式图标消失的解决办法
  8. Linux搭建samba服务及使用案例
  9. 许久没有写过原创文章了
  10. 如何做数据分析报告?