ffmpeg使用硬件加速hwaccel、cuvid、h264_cuvid、h264_nvenc
文章目录
- 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相关推荐
- FFMPEG NVIDIA硬件加速总结
目录 1.NVDIA概述 2.FFmpeg集成到GPU 3.FFmpeg uses Video Codec SDK 4.ffmpeg对NVIDIA GPU的编译步骤 4.1configure命令 4. ...
- ffmpeg Nvidia硬件加速总结
0. 概述 FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用.Video Codec SDK包含完整的的高性能工具.源码及文档,支 ...
- ffmpeg Intel硬件加速总结
0. 概述 FFmpeg可通过Intel的GPU进行加速,加速器的名称是Intel Quick Sync Video,简称qsv,支持该加速器的Intel处理器的型号是带有Intel Iris gra ...
- FFmpeg视频解码硬件加速
<音视频应用开发系列文章目录> ffmpeg支持的硬件解码器 enum AVHWDeviceType {AV_HWDEVICE_TYPE_NONE,AV_HWDEVICE_TYPE_VDP ...
- ffmpeg gpu硬件加速
整理下自己百度以及实验成功的结果 0. 成功截图. 一开始, 我用cpu去跑, 速度大约在 3-5 s 这样子. 用gpu去跑,速度就到15-20 这个样子. 确实快了很多. 1. 环境安装及检查. ...
- 使用GPU硬件加速FFmpeg视频转码
最近看了些视频处理相关的文章,这里有一篇是讲如何使用Nvidia显卡为视频的编解码进行加速的, 为了方便查阅就转载了: 本文内容包括: 在Linux环境下安装FFmpeg 通过命令行实现视频格式识别和 ...
- FFmpeg再学习 -- 硬件加速编解码
为了搞硬件加速编解码,用了一周时间来看 CUDA,接下来开始加以总结. 一.什么是 CUDA (1)首先需要了解一下,什么是 CUDA. 参看:百度百科 -- CUDA 参看:CUDA基础介绍 参看: ...
- ffmpeg 硬件加速视频转码指南
0. 系统环境 基于 Windows 下演示,Linux 下也可以适用. 所使用 ffmpeg 版本为 BtbN 编译的 win64-gpl 版(非 gpl-share),项目地址:BtbN / FF ...
- FFmpeg 硬件加速方案概览 (下)
被称为"多媒体技术领域的瑞士军刀",FFmpeg拥有广泛的应用基础.不过,当(实时)处理海量视频时,需要借助各种方法提升效率.比如,短视频平台Revvel将视频转码服务迁移到AWS ...
最新文章
- 销量过亿的《剑指0ffer》题目和答案电子书 (附下载)
- linux sed 小数点,每天进步一点点——linux——sed
- R语言使用hexSticker包将ggplot2包可视化的结果转换为六角图(六角贴、六角形贴纸、ggplot2 plot to hex sticker)、并自定义设置文本的内容、文本对应的字体
- php cgi漏洞,CGI漏洞攻击合集上
- 强大的,方便编程的vim配置
- 两个html页面之间通讯,面试官:前端跨页面通信,你知道哪些方法?
- 织梦响应式教育机构官网网站模板
- js数组查找最接近_如何从javascript中的对象数组中获取最接近的先前id
- Codeforces Gym 100463A Crossings 逆序数
- 输入班级人数,根据人数,挨个输入成绩,求平均分,求最高分最低分
- 【李宏毅2020 ML/DL】P78 Generative Adversarial Network | fGAN: General Framework of GAN
- 使用Scikit-Learn,XGBoost,LightGBM和CatBoost进行梯度增强
- 台达人机界面编程小技巧之合理使用偏移地址
- pano2vr无法输出html5,教大家Pano2VR怎么输出全景图的方法
- 计算机毕业设计ssm线上学习系统8e88w系统+程序+源码+lw+远程部署
- CTFshow——萌新记忆
- 比尔·盖茨买百万亩农地成美“头号地主”,图扑数字孪生农场
- 案例复盘:从上海首例遗弃犬只案看 如何精准研判舆情争议点
- 三星在美三大报投整版道歉信 中美待遇为何迥然不同
- js如何判断保留两位小数
热门文章
- 在docker容器中操作es,并给es7.6添加用户鉴权设置密码
- Ubuntu18 网速显示 插件 显示在状态栏
- 海康威视综合安防平台视频摄像头接入Java
- 虚拟机一插U盘或读卡器就死机的解决办法
- A systems-biology model of the tumor necrosis factor (TNF) interactions with TNF receptor 1 and 2
- Niubility (分享一) Flink 在快手实时多维分析场景的应用
- win7计算机里没有桌面快捷方式,Win7桌面快捷方式图标消失的解决办法
- Linux搭建samba服务及使用案例
- 许久没有写过原创文章了
- 如何做数据分析报告?