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兼容主流视频编解码工具链,NV官网:https://developer.nvidia.com/nvidia-video-codec-sdk/download
建议下载跟PPU SDK配套的加速工具链版本对应的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声明配套的加速工具链版本不一致,编译可能出错,此时可以执行如下命令:
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 4
-
PPU有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接口