Video Codec/Image使用指南 (v1.5)
1. 综述
PPU可兼容支持NVidia提供的相关视频图像编解码和前后处理的硬件加速库。主要包括:
Video Codec SDK:提供cuvid decode和nv encode硬件加速支持,目前版本12.2。
nvJPEG:提供JPEG decode和JPEG encode硬件加速支持,目前版本12.3。
npp:提供2D图像后处理的硬件加速支持,目前版本11.6。
2. 应用生态
如下应用或框架可以比较容易地使用硬件加速能力。
FFmpeg:编译时打开cuvid、nvenc和libnpp,可以支持硬件加速能力。在视频编码,解码或者转码时,可以指定使用cuvid,nvenc或者npp filter。FFmpeg有非常广泛的应用,大部分视频编码或者解码应用都会直接依赖FFmpeg,包括PyAV(torchvision的backend)。
DALI:NVidia提供的data loader并行加速框架,可以支持JPEG编解码和视频编解码的硬件加速。
除了以上比较流行的大型框架之外,如果想要直接使用Codec/Jpeg的相关接口,也可以使用:
nvImageCodec:NV提供的封装库,可以读取多种类型的图像资源并转成tensor data;也可以支持JPEG硬件编码;提供Python接口。
VPF:NV提供的VideoProcess Framework封装库,封装Video Codec SDK的能力且提供Python接口。
官网:https://developer.nvidia.com/blog/vpf-hardware-accelerated-video-processing-framework-in-python/
VPF与最新ffmpeg可能会存在编译兼容问题,如有遇到,可以参考下面的patch:
在部分docker上,在VideoProcessingFramework下执行
pip install . -v会发生卡住的现象,如有遇到,可以pip uninstall ninja卸载重装ninja尝试。
3. 编译运行
Video Codec SDK
PPU Video Codec兼容Nvidia Video Codec SDK,NV官网:https://developer.nvidia.com/nvidia-video-codec-sdk/download
建议下载跟PPU SDK的cuda兼容版本对应的Video Codec SDK版本,已知版本对应关系如下:

编译前准备
因为PPU不支持OpenGL和Vulkan,所以编译前需要修改Samples/CMakeLists.txt文件,去掉不支持的工程,建议只保留编解码常用的一些工程:
# 保留如下,其他都注释掉 add_subdirectory(AppEncode/AppEncCuda) add_subdirectory(AppEncode/AppEncPerf) add_subdirectory(AppEncode/AppEncMultiInstance) add_subdirectory(AppEncode/AppEncDec) add_subdirectory(AppTranscode/AppTrans) add_subdirectory(AppTranscode/AppTransPerf) add_subdirectory(AppDecode/AppDec) add_subdirectory(AppDecode/AppDecMultiFiles) add_subdirectory(AppDecode/AppDecPerf)VideoCodecSDK依赖于ffmpeg提供demux能力,所以需要预先安装ffmpeg,虽然它只是需要demux能力,不一定非要安装支持硬件加速的ffmpeg(可参考 《Video FFMPEG使用指南》),但为了避免混淆,建议还是统一编译安装支持硬件加速的ffmpeg。
假设ffmpeg安装目录为
FFMPEG_PATH,执行pkg-config --modversion libavcodec可以显示版本号;如果不显示,可以尝试先export PKG_CONFIG_PATH=$FFMPEG_PATH/lib/pkgconfig:$PKG_CONFIG_PATH,然后再尝试执行pkg-config指令。说明如果编译时不指定,默认为/usr/local目录,否则为指定目录,ffmpeg的lib、include、bin内容会被拷贝到
$FFMPEG_PATH/include、$FFMPEG_PATH/lib和$FFMPEG_PATH/bin。指定CUDA_PATH
export CMAKE_LIBRARY_PATH=${CUDA_HOME}/lib64这里CUDA_HOME指向PPU SDK目录下的CUDA_SDK。
如果下载的Video Codec SDK版本和PPU SDK声明兼容的CUDA版本不一致,编译可能出错,此时可以执行如下命令:
cp Interface/* ${CUDA_HOME}/include这里的Interface指下载的Video Codec SDK下的Interface目录。
编译
cd Samples # Sample folder of the video-codec-sdk download path
mkdir build
cd build
cmake ..
make运行
# 解码,同时运行12个线程可以打满性能
./AppDecode/AppDecPerf/AppDecPerf -thread 12 -i test_1920x1080_yuv420p_50fps_h264.mp4
# 编码,同时运行4个线程可以打满性能
./AppEncode/AppEncPerf/AppEncPerf -i crowd_run_1920x1088_nv12_8bit_50.0fps_n500.yuv -s 1920x1088 -if nv12 -fps 30 -preset p4 -gop 60 -rc cbr -bitrate 10000000 -codec h265 -thread 4PPU有12个video decode core,理论上12个线程可以达到最佳性能,继续增加线程可能会稍微提升性能,但不会有较大提升。7个以内的PPU进程可以达到理想性能,使用PPU的进程数量超过7个时,性能不会再提升。
PPU有4个video encode core,所以理论上4个线程可以达到最佳性能。
nvJpeg:
PPU SDK完整兼容nvJPEG,可以直接通过nvJPEG sample来测试jpeg。nvJpeg官网:https://developer.nvidia.com/nvjpeg
nvJpeg samples: https://github.com/NVIDIA/CUDALibrarySamples/tree/master/nvJPEG/
编译:
(解码在nvJPEG-Decoder目录,编码在nvJPEG-Encoder目录)
$ mkdir build
$ cd build
$ cmake ..
$ make运行:
# 解码,假设jpeg图片集在1080P目录下,batch size是128
./nvjpegDecoder -i 1080p/ -b 128
# 编码(sample实际是先解码再编码)
./nvJPEG_encoder -i input.jpg -o output.jpg说明:
PPU有4个 jpeg encode core,所以理论上4个线程可以达到最佳性能;有8个jpeg decode core,batch模式会自动内部enable 8个线程以达到最佳性能。
4. 详细规格
Video Decode
Support cuvid decoder。
Codecs:
HEVC (H.265) - ITU-T Rec. H.265 (04/2013), ISO/IEC 23008-2
Main Profile, Level 5.1, High Tier
Main10 Profile, Level 5.1, High Tier
Main Still Profile
VP9 - vp9-bitstream-specification-v0.6-20160331-draft
Profile 0, 8-bit
Profile 2, 10-bit
AVC (H.264) - ITU-T Rec. H.264 (03/2010) / ISO/IEC 14496-10
Main Profile, levels 1 - 5.2
High Profile, levels 1 - 5.2
High 10 Profile, levels 1 - 5.2
Baseline Profile, levels 1 - 5.2
AV1 Bitstream & Decoding Process Specification Version 1.0.0 with Errata 1
Main Profile, Level 5.1
AVS2
Resolution Up to 8192x8192
Up to FHD 192 streams
Video Encode
Support nvenc
Codecs:
AVC(H.264):Spec Version 12:ISO/IEC 14496-10 / ITU-T Rec. H.264 (03/2010)
Baseline Profile, levels 1 – 5.2
Main Profile, levels 1 - 5.2
High Profile, levels 1 – 5.2
High 10 Profile, levels 1 - 5.2
HEVC(H265):ITU-T Rec. H.265 (04/2013), ISO/IEC 23008-2
Main Profile, Level 5.1, High Tier
Main10 profile, Level 5.1, High Tier
Main Still Profile
AV1 Bitstream Specification Version 1.0.0 with Errata 1
Main Profile, Level 5.1
Resolution up to 4K support
Support input RGB format (converted to YUV420 via inlinePP)
Support crop, scale, rotate with inlinePP
Up to FHD 32 streams
Jpeg
Support nvjpeg decoder & encoder
Resolution up to 32Kx32K
Support RGB format input and output with inlinePP
Support crop, scale, rotate with inlinePP
Up to UHD 960FPS
Image Process
Support Nvidia 2D Image NPP
5. 已知问题
Video Decode
支持cuvid decode模式,不支持raw nvdec模式(cuvid模式和nvdec模式有相同的硬件加速能力,cuvid模式使用更简单)。
不支持MPEG1、MPEG2、MPEG4、VC1、VP8等legacy格式。
Video Encode
不支持YUV444 12bits
Jpeg
不支持lossless
不支持JPEG2000
2D Image
Npp只支持Image Process接口,不支持Signal Process接口