ffmpeg使用硬件加速hwaccel、cuvid、h264 | 您所在的位置:网站首页 › h265显卡加速 › ffmpeg使用硬件加速hwaccel、cuvid、h264 |
文章目录
ffmpeg支持硬件加速的原理所用环境说明ffmpeg使用硬件加速安装nvidia驱动安装cuda加入header安装pkgconfig开始配置
在ffmpeg中看如何使用硬件加速查看目前可以用的hwaccel选项普通的解码命令仅仅是转码,不做缩放转码,外带一个缩放
题外话,如何使用scale_npp简单分析一下ffmpeg源码中的硬件加速部分参考网站
ffmpeg支持硬件加速的原理
ffmpeg的硬件加速原理大概就是采用硬件对编解码进行处理,硬件有转码进行解码的sdk,比如nvidia的sdk等 所用环境说明 ffmpeg版本:4.2.2cuda版本:10.2nvidia驱动版本: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)输出如下内容 由于使用到了硬件加速,那么在配置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出现如下内容 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 -ygpu操作命令 ./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/lib64make后得到的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函数中 |
CopyRight 2018-2019 实验室设备网 版权所有 |